我正在加载并尝试应用一些阴影(为了简单起见,通过固定管道+着色器组合)的 3d obj(波前)模型显示错误。
现在有一些我认为我可以发现的问题。轻微的问题:似乎不是一成不变的。当我通过变换旋转对象时,它似乎在旋转。我正在使用 gluLookAt+gluPerspective 来设置我的视图矩阵,我已经读过如果你在应用 gluLookAt 之前在 opengl 中应用灯光,理论上你的灯光保持静态。这似乎不是这里的情况。
问题 2 是模型被着色的方式。它有点波涛汹涌而不是平滑,我什至不确定为什么会出现这种环形效果。我已经在 ShaderMaker 中加载了我的网格,并应用了我的顶点+片段着色器,一切都绘制得很完美。好像我在我的绘图程序中做错了什么。
我的顶点着色器:
#version 120
varying vec3 N;
varying vec3 v;
void main(void)
{
v = vec3(gl_ModelViewMatrix * gl_Vertex);
N = normalize(gl_NormalMatrix * gl_Normal);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
我的片段着色器:
#version 120
varying vec3 N;
varying vec3 v;
#define MAX_LIGHTS 2
void main (void)
{
vec4 finalColour;
vec4 amb;
amb = vec4(0.2,0.2,0.2,1.0);
vec4 diff;
diff = vec4(1.0,1.0,1.0,1.0);
vec3 L = normalize(gl_LightSource[0].position.xyz - v);
vec3 E = normalize(v);
vec3 R = normalize(reflect(L,-N));
//vec4 Iamb = gl_FrontLightProduct[i].ambient;
vec4 Iamb = amb;
//vec4 Idiff = gl_FrontLightProduct[i].diffuse * max(dot(N,L), 0.0);
vec4 Idiff = diff * max(dot(N,L), 0.0);
Idiff = clamp(Idiff, 0.0, 1.0);
vec4 Ispec = gl_FrontLightProduct[0].specular
* pow(max(dot(R,E),0.0),0.0*gl_FrontMaterial.shininess);
Ispec = clamp(Ispec, 0.0, 1.0);
finalColour += Iamb + Idiff;
gl_FragColor = gl_FrontLightModelProduct.sceneColor + finalColour;
}
编辑 ::添加了我的绘图程序。
[[self openGLContext] makeCurrentContext];
[sM useProgram];
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glClearColor(0.0f,0.0f,0.0f,1.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float aspect = (float)1024 / (float)576;
gluPerspective(15.0, aspect, 1.0, 15.0);
glMatrixMode(GL_MODELVIEW);
float lpos[4] = {0.0,2.0,0.0,1.0};
glLoadIdentity();
glLightfv(GL_LIGHT0, GL_POSITION, lpos);
gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glTranslatef(0.0f, 0.0f, 0.0f);
glScalef(0.5f, 0.5f, 0.5f);
glRotatef(self.rotValue, 1.0f, 1.0f, 0.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
NSLog(@"%i", self.W);
if(self.W == NO)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
if (self.W == YES)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
glColor3f(1.0f,0.0f,0.0f);
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_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
GLenum err = glGetError();
if (err != GL_NO_ERROR)
NSLog(@"glGetError(): %i", (int)err);
[[self openGLContext] flushBuffer];
我的着色器实际上是从在线资源借来的。我自己做了,但我想确保我使用的是有经验的人提供的可靠的。在我解决这个问题之前,我不打算保留它们。