В некоторой степени похоже на проблему, с которой я сталкивался ранее и публиковал ранее, я пытаюсь настроить нормальное отображение в моем приложении GLSL.В целях моего объяснения я использую модель ninjaHead.obj, поставляемую с RenderMonkey, для целей тестирования ( вы можете получить ее здесь ).Теперь в окне предварительного просмотра в RenderMonkey все выглядит великолепно:
и генерируемый код вершины и фрагмента соответственно:
Вершина:
uniform vec4 view_position;
varying vec3 vNormal;
varying vec3 vViewVec;
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// World-space lighting
vNormal = gl_Normal;
vViewVec = view_position.xyz - gl_Vertex.xyz;
}
Фрагмент:
uniform vec4 color;
varying vec3 vNormal;
varying vec3 vViewVec;
void main(void)
{
float v = 0.5 * (1.0 + dot(normalize(vViewVec), vNormal));
gl_FragColor = v* color;
}
Я основал свой код GLSL на этом, но я не совсем получил ожидаемые результаты ...
Код моего вершинного шейдера:
uniform mat4 P;
uniform mat4 modelRotationMatrix;
uniform mat4 modelScaleMatrix;
uniform mat4 modelTranslationMatrix;
uniform vec3 cameraPosition;
varying vec4 vNormal;
varying vec4 vViewVec;
void main()
{
vec4 pos = gl_ProjectionMatrix * P * modelTranslationMatrix * modelRotationMatrix * modelScaleMatrix * gl_Vertex;
gl_Position = pos;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
vec4 normal4 = vec4(gl_Normal.x,gl_Normal.y,gl_Normal.z,0);
// World-space lighting
vNormal = normal4*modelRotationMatrix;
vec4 tempCameraPos = vec4(cameraPosition.x,cameraPosition.y,cameraPosition.z,0);
//vViewVec = cameraPosition.xyz - pos.xyz;
vViewVec = tempCameraPos - pos;
}
Код моего фрагментного шейдера:
varying vec4 vNormal;
varying vec4 vViewVec;
void main()
{
//gl_FragColor = gl_Color;
float v = 0.5 * (1.0 + dot(normalize(vViewVec), vNormal));
gl_FragColor = v * gl_Color;
}
Однако мой рендер производит это ... ![openGL render](https://i.stack.imgur.com/6ghhX.png)
Кто-нибудь знает, что может быть причиной и / или как заставить это работать?
РЕДАКТИРОВАТЬ В ответ на комментарии kvark, вот модель, представленная без каких-либо нормальных / осветительных расчетов, чтобы показать все визуализируемые треугольники.![Render flat shading](https://i.stack.imgur.com/7d1UZ.png)
А вот модель затенения с нормалями, используемыми для цветов.Я считаю, что проблема была найдена!Теперь причина в том, почему это делается так и как это решить?Предложения приветствуются!![Normal shading](https://i.stack.imgur.com/BzqyD.png)
РЕШЕНИЕ Ну, всем проблема решена!Спасибо kvark за всю его полезную информацию, которая определенно помогла моей практике программирования, но я боюсь, что ответ исходит от меня, как МАССОВОЙ синицы ... У меня была ошибка в функции display () моего кода, которая установила смещение glNormalPointerк случайному значению.Раньше это было:
gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getNormalsBufferObject());
gl.glNormalPointer(GL.GL_FLOAT, 0, getNormalsBufferObject());
Но должно было быть так:
gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getNormalsBufferObject());
gl.glNormalPointer(GL.GL_FLOAT, 0, 0);
Так что, думаю, это урок.НИКОГДА бездумно не нажимайте Ctrl + C и Ctrl + V, чтобы сэкономить время в пятницу днем И ... Если вы уверены, что часть кода, на которую вы обращаетесь, верна, проблема, вероятно, где-то еще!