GLSL纹理映射结果为纯色

时间:2014-03-17 01:57:39

标签: c opengl glsl shader

我正在尝试编写一些基本着色器来将ppm文件映射到我的形状。不幸的是,我没有一个漂亮的五彩纹理(我使用的是石砖图案),而是一种深紫色的坚实阴影。

这是我的代码:
在里面:

printf("Using %d: Texture shading\n", shaderType);
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &textName);
int w, h;
texture = glmReadPPM("brick.ppm", &w, &h);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
printf("W%dH%d\n", w, h);
glTexImage2D(GL_TEXTURE_2D, 0, 3, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textName);
programID = LoadShaders("text.vert", "text.frag");

渲染:

glClearColor( 0.6f, 0.85f, 1.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
/*Unrelated code here*/
glUseProgram(programID);
varloc = glGetUniformLocation(programID,"texture1");
glUniform1i(varloc, textName);
glLightfv(GL_LIGHT0, GL_SPOT_CUTOFF, &cutOff);
gluLookAt (posx, posy, zoom,
           lookx,looky,0,
           0,1,0);
glRotatef(anglex,0.0f,1.0f,0.0f);
glRotatef(angley,1.0f,0.0f,0.0f);

renderTriangles(); //Renders mountains from a list using intermediate mode
                   // Yes, I know it's deprecated
glutSwapBuffers(); 
glui->sync_live();
glUseProgram(0);

顶点着色器:

varying vec2 uv;
void main() {
    uv = vec2(gl_MultiTexCoord0.st);
    gl_Position = ftransform();
}

Fragment Shader:

uniform sampler2D texture1;
varying vec2 uv;
void main() {
    gl_FragColor = texture2D(texture1, uv);
}

有人在这看到任何问题吗?我似乎无法弄明白。

我尝试了一个基本的白色和阅读2x2浮动,但再次,我有一种颜色。它是浅红色。

2 个答案:

答案 0 :(得分:4)

如果您为整个对象获得单一颜色,则纹理坐标可能有问题。我会试着看着它们,看看它们是否正确。您可以通过修改片段着色器来完成此操作:

gl_FragColor = vec3(uv.xy, 0);

如果您的整个图像仍然使用一种颜色进行渲染,那么您发送纹理坐标的方式就会出现问题。你正在使用一些不推荐使用的功能(立即模式,gl_MultiTexCoord0),也许它没有像你期望的那样协同工作:

“请记住,对于GLSL 1.30,您应该定义自己的顶点属性。” http://www.opengl.org/wiki/GLSL_:_common_mistakes

答案 1 :(得分:0)

看起来你拥有所有其他纹理函数后绑定纹理。你应该在调用glGenTextures之后立即调用glBindTexture,因为你必须先绑定纹理才能将图像上传到它中。另一个问题是,在调用glUniform1i(varloc,textName)时,不应将采样器的统一变量设置为textName,而应将其设置为0,因为该变量表示活动纹理单元,并且您使用了glActiveTexture(GL_TEXTURE0);