所以即时测试我的着色器(Apple的OpenGL Shader Builder上的顶点+片段+(只是导入我的着色器文件),即使它似乎工作正常到目前为止,当我尝试使用它们时它似乎不起作用在我的OpenGL应用程序中。 我想采用最简单的环境+漫射照明。
编辑:: 我从此网格导入数据(obj wavefront) - > http://pastebin.com/cDyjHHNn
以下是问题的捕获: (OpenGL Shader Builder上的茶壶,OpenGL应用程序上的多维数据集)
我的顶点着色器:
#version 120
vec4 ambien = vec4(0.2,0.2,0.2,1.0);
vec4 diffuz = vec4(1.0,1.0,1.0,1.0);
//Fixed Light source position.
vec3 LS = vec3(0.0, 15.0, 5.0);
void main()
{
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
vec4 LS2;
//LS2 = gl_ModelViewProjectionMatrix * vec4(LS,1.0);
vec3 normal, lightDir;
vec4 diffuse, ambient, globalAmbient;
float NdotL;
normal = normalize(gl_NormalMatrix * gl_Normal);
lightDir = normalize(LS.xyz);
NdotL = max(dot(normal, lightDir), 0.0);
diffuse = diffuz * diffuz;
ambient = ambien * ambien;
globalAmbient = ambien * ambien;
gl_FrontColor = NdotL * diffuse + globalAmbient + ambient;
}
My Fragment Shader:
#version 120
void main(void)
{
gl_FragColor = gl_Color;
}
我的OpenGL应用程序绘图例程:
- (void) drawFrameWithObject
{
[[self openGLContext] makeCurrentContext];
[sM useProgram];
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float aspect = (float)1024 / (float)576;
glOrtho(-aspect, aspect, -1, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, 0.0f);
glScalef(0.3f, 0.3f, 0.3f);
glRotatef(self.rotValue, 1.0f, 1.0f, 0.0f);
glEnableClientState(GL_VERTEX_ARRAY);
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBindBuffer(GL_ARRAY_BUFFER, vBo[0]);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vBo[1]);
glNormalPointer(GL_FLOAT, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vBo[2]);
glDrawElements(GL_TRIANGLES, object.indicesCount, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDisableClientState(GL_VERTEX_ARRAY);
[[self openGLContext] flushBuffer];
}
底线,因为我的着色器在OpenGL Shader Builder中工作,我想我可以放心地认为问题不在我的着色器中。可能是我的应用程序中的转换?一些缺少的opengl状态/设置/属性我缺少?我已经尝试了很多不确定是不是错了。
答案 0 :(得分:2)
您将glNormalPointer
设置为您应用的正常数据,但是您忘记使用glEnableClientState(GL_NORMAL_ARRAY)
启用普通数组(并且不要忘记在绘制后再次禁用它),就像您一样做位置数组。因此,所有顶点都具有相同的默认法线,这与您观察到的效果完全吻合。