尝试使用OpenGL中的着色器对球体进行纹理处理

时间:2011-06-06 02:49:52

标签: c++ opengl shader

我正在从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);
}

2 个答案:

答案 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 *函数,因为它们会影响当前程序。