Почему добавление нуля меняет результат вершинного шейдера - PullRequest
0 голосов
/ 04 октября 2018

Эти два вершинных шейдера должны быть скомпилированы в одну и ту же сборку GPU, но результаты отображаются только в одном.

Первый вершинный шейдер показывает все как положено:

#version 120
attribute vec3 aPos;
uniform float i;
void main() {
  gl_FrontColor=gl_Color;
  gl_Position = mat4x4(cos(radians(i)),0.,0.,0., 0.,1.+i*0.,0.,0., 0.,0.,1.,0., 0.,0.,0.,1.)*vec4(aPos.x,aPos.y,aPos.z,1.);
}

Вторая вершинашейдер ничего не отображает:

#version 120
attribute vec3 aPos;
uniform float i;
void main() {
  gl_FrontColor=gl_Color;
  gl_Position = mat4x4(cos(radians(i)),0.,0.,0., 0.,1.,0.,0., 0.,0.,1.,0., 0.,0.,0.,1.)*vec4(aPos.x,aPos.y,aPos.z,1.);
}

Информация журнала для состояний обоих шейдеров

Vertex shader was successfully compiled to run on hardware.
Vertex shader(s) linked, no fragment shader(s) defined. 

Единственное различие между двумя шейдерами состоит в том, что первый шейдер имеет 1.+i*0., а второй шейдер имеетболее простой 1..

Так зачем добавлять i*0., чтобы исправить шейдер и заставить его работать должным образом?

Это поведение определяется спецификацией GLSL?

Примечание : Надеюсь, это не актуально.Я использую Cygwin, поэтому связанная DLL - это cygGL-1.dll, а связывание с этой DLL недостаточно для запуска программы, и мне пришлось прибегнуть к использованию SDL_GL_GetProcAddress(), чтобы заставить функции работать должным образом, так что это может бытьдальнейшая проблема с Cygwin DLL, если на самом деле имеет место эта тенденция, возможно, несовместимого поведения.

...