【问题标题】:Fixed Pipeline texture rendering修复了管线纹理渲染
【发布时间】:2015-08-09 05:02:17
【问题描述】:

我正在尝试将生成的 2D 纹理映射到四边形。到目前为止,四边形已渲染,但如果我不设置颜色并且为顶点设置颜色,它会显示颜色,但它是灰色的,但未显示纹理。

使用固定管道而不是着色器的原因是为了生成纹理,我必须将太多数据传递给着色器才能有效地生成纹理。所以理想情况下,我不想为应该像在四边形上渲染纹理一样简单的东西使用着色器。尽管该程序广泛使用着色器。

我尝试使用 GLubyte 将数据传递给 glTexImage2D,但得到了相同的结果。我还尝试了各种位置来调用 glEnable(GL_TEXTURE_2D)、glBindTexture、glTexParameteri 和 glTexImage2D。 此外,我还评论了 glTexEnvf、glBindTexture(解除绑定)、glDisable(GL_TEXTURE_2D) 和 glDeleteTextures(...)。 结果都一样。

也许不能在同样使用着色器的程序中使用固定管道纹理渲染?还是我在代码中犯了错误?据我所见,根据谷歌,下面的代码应该在四边形上渲染纹理。这几天一直困扰着我,可能这是一个简单的错误......

glGetError 在 sn-p 中的所有位置都返回 0。

    std::cout<<glGetError()<<std::endl;

    GLuint texName;

    glGenTextures(1, &texName);

    glBindTexture(GL_TEXTURE_2D, texName);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

    std::cout<<glGetError()<<std::endl;

    GLfloat image[64][64][4];

    for(unsigned int i = 0; i<64; i++)
    {
        for(unsigned int j = 0; j<64; j++) 
        {
            image[i][j][0] = 1.0f;
            image[i][j][1] = 0.5f;
            image[i][j][2] = (float)i/64;
            image[i][j][3] = 1.0f;
        }
    }

    std::cout<<glGetError()<<std::endl;

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 
        64, 0, GL_RGBA, GL_FLOAT, 
        image);

    std::cout<<glGetError()<<std::endl;

    glEnable(GL_TEXTURE_2D);

    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);

    glBindTexture(GL_TEXTURE_2D, texName);

    glBegin(GL_QUADS);
        glTexCoord2f(0, 0);     glVertex2i(10,  10);
        glTexCoord2f(0, 1);     glVertex2i(10,  110);
        glTexCoord2f(1, 1);     glVertex2i(110, 110);
        glTexCoord2f(1, 0);     glVertex2i(110, 10);
    glEnd();        

    glBindTexture(GL_TEXTURE_2D, 0);

    glDisable(GL_TEXTURE_2D);

    glDeleteTextures(1, &texName);

    std::cout<<glGetError()<<std::endl;

【问题讨论】:

  • 为什么不生成纹理然后将它们传递给着色器?如果您的软件广泛使用它们,那么您的框架已经经过尝试和测试
  • 这是另一种选择,使用着色器会增加混乱,当然不会使代码更具可读性。我不喜欢为应该很简单的东西添加太多(可能是不必要的)代码。
  • 在没有看到您如何设计代码的情况下,我无法评论任何一种方式。如果我有机会,将调查您当前遇到的问题。希望你能找到答案!
  • 您不能同时拥有着色器和固定功能。那么您是否禁用了着色器以使用固定功能 glUseProgram(0) 进行绘制?另外,我和 D Hansen 在一起,我不确定我是否理解着色器路径有什么不同。

标签: c++ opengl textures


【解决方案1】:

我应该在我的问题中提到我希望纹理出现在屏幕上(2D)。

一位同事能够帮助我并建议使用 glDrawPixels 可以正常工作,而无需禁用着色器运行(我不知道它们必须被禁用,因为大多数固定管道的东西似乎都可以工作,所以谢谢 Bahbar)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多