OpenGL 纹理映射禁用着色

Posted

技术标签:

【中文标题】OpenGL 纹理映射禁用着色【英文标题】:OpenGL texture mapping disables shading 【发布时间】:2011-12-01 16:45:47 【问题描述】:

我当前的 openGL 应用程序只是一个球体和一个地板,照明和阴影工作正常。

通过红皮书教程为地板添加二维纹理后:http://fly.cc.fer.hr/~unreal/theredbook/chapter09.html

.. 我的阴影被禁用了。如果我禁用 GL_TEXTURE_2D,一切都会正确渲染,但纹理显然不会显示。这是已知解决方法的已知问题吗?下面是一些代码供参考:

#define    checkImageWidth 64
#define    checkImageHeight 64
GLubyte checkImage[checkImageWidth][checkImageHeight][3];

void makeCheckImage(void)

    int i, j, c;

       for (i = 0; i < checkImageWidth; i++) 
        for (j = 0; j < checkImageHeight; j++) 
            c = ((((i&0x8)==0)^(((j&0x8))==0)))*255;
            checkImage[i][j][0] = (GLubyte) c;
            checkImage[i][j][1] = (GLubyte) c;
            checkImage[i][j][2] = (GLubyte) c;
        
    



void initImage() 

    makeCheckImage();
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth, 
        checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 
        &checkImage[0][0][0]);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
        GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
        GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

然后是粗略的地面绘制函数:

void makeGround() 

    GLfloat mat_specular[]      =  0.5, 0.5, 0.5, 0.5 ;
    GLfloat mat_diffuse[]       =  0.3, 0.3, 0.3, 0.3 ;
    GLfloat mat_shininess[]     =  25.0 ;

    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

    glColor3f(0.2, 0.2, 0.2);

    glBegin(GL_QUADS);
        glTexCoord2f(0.0, 0.0); glVertex3f(-100.0f, -1.0f, -100.0f);
        glTexCoord2f(0.0, 1.0); glVertex3f(-100.0f, -1.0f,  100.0f);
        glTexCoord2f(1.0, 1.0); glVertex3f( 100.0f, -1.0f,  100.0f);
        glTexCoord2f(1.0, 0.0); glVertex3f( 100.0f, -1.0f, -100.0f);
    glEnd();
    glFlush();


如果您需要查看代码的任何其他部分,请告诉我

【问题讨论】:

【参考方案1】:
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

贴花是一种奇怪的环境模式。对于 GL_RGB 纹理(如您的),它替换颜色。对于 RGBA 纹理,它会将其与来自纹理的 Alpha 混合。

如果你只想用光照调制纹理,请使用 GL_MODULATE

【讨论】:

以上是关于OpenGL 纹理映射禁用着色的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:着色器存储缓冲区映射/绑定

顶点着色器 glsl qt 中的纹理映射

OpenGL 4.3错误地将第4个纹理坐标映射到与第3个纹理坐标相同的位置

手动使用圆柱体中间表面进行纹理映射

opengl 把纹理映射到立方体的六个面。

OpenGL纹理映射总结