我正在从OpenGL SuperBible一书中学习OpenGL。我试图渲染使用函数gltMakeSphere()创建的球体。我绑定一个纹理并运行useProgram()。着色器使用GLBatch处理三角形,但球体只有绿色。
以下是代码:
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
modelViewMatrix.PushMatrix();
modelViewMatrix.Translate(0,0,-5.0f);
GLint locMVP = glGetUniformLocation(testShader, "mvpMatrix");
glBindTexture(GL_TEXTURE_2D, texture1ID);
glUniformMatrix4fv(locMVP, 1, GL_FALSE,
transformPipeline.GetModelViewProjectionMatrix());
glUseProgram(testShader);
testBatch.Draw();
sphereObject.Draw();
glutSwapBuffers();
glutPostRedisplay();
modelViewMatrix.PopMatrix();
}
顶点着色器
#version 130
in vec4 vVertex;
in vec2 vTexCoords;
smooth out vec2 vVaryingTexCoords;
void main(void)
{
vVaryingTexCoords = vTexCoords;
gl_Position = vVertex;
}
片段着色器
#version 130
uniform sampler2D colorMap;
out vec4 vFragColor;
smooth in vec2 vVaryingTexCoords;
void main(void)
{
vFragColor = texture(colorMap, vVaryingTexCoords.st);
}
答案 0 :(得分:0)
我能想到的唯一想法是你没有在这里设置核心坐标:
sphereObject.Draw();
尝试以较低的精度(较少的多边形)渲染球体,并查看是否获得纹理
答案 1 :(得分:0)
验证纹理坐标是否正确(或者至少每个像素变化而不是整个球体上的恒定颜色)的一种方法是更改片段着色器以将纹理坐标输出为颜色。
#version 130
uniform sampler2D colorMap;
out vec4 vFragColor
smooth in vec2 vVaryingTexCoords;
void main(void)
{
vFragColor = vec4(vVaryingTexCoords, 0.0f, 1.0f);
}
如果使用此着色器以恒定颜色绘制球体,则纹理坐标会出现问题。
此外,请确保在调用glUseProgram后调用任何glUniform *函数,因为它们会影响当前程序。