固定管道纹理渲染
Fixed Pipeline texture rendering
我正在尝试将生成的 2D 纹理映射到四边形上。到目前为止四边形已渲染,但如果我不设置颜色它是灰色的,如果我为顶点设置颜色它会显示颜色,但不会显示纹理。
使用固定管道而不是着色器的原因是为了生成纹理,我必须将太多数据传递给着色器才能有效地生成纹理。所以理想情况下,我不想为应该像在四边形上渲染纹理一样简单的东西使用着色器。尽管该程序广泛使用着色器。
我尝试使用 GLubyte 将数据传递给 glTexImage2D,但得到了相同的结果。我还尝试了各种位置来调用 glEnable(GL_TEXTURE_2D)、glBindTexture、glTexParameteri 和 glTexImage2D。
此外,我评论了 glTexEnvf、glBindTexture(解除绑定)、glDisable(GL_TEXTURE_2D) 和 glDeleteTextures(...)。
结果都一样。
也许在同样使用着色器的程序中不能使用固定管线纹理渲染?还是我的代码有误?据我所知,根据 Google,下面的代码应该在四边形上渲染纹理。它困扰了我几天,可能是一个简单的错误...
glGetError returns 代码段中所有位置均为 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;
我应该在我的问题中提到我希望纹理显示在屏幕上(2D)。
一位同事能够帮助我并建议使用 glDrawPixels,它可以在不禁用着色器的情况下工作 运行(我不知道必须禁用它们,因为大多数固定管道的东西似乎都可以工作,所以谢谢 Bahbar)。
我正在尝试将生成的 2D 纹理映射到四边形上。到目前为止四边形已渲染,但如果我不设置颜色它是灰色的,如果我为顶点设置颜色它会显示颜色,但不会显示纹理。
使用固定管道而不是着色器的原因是为了生成纹理,我必须将太多数据传递给着色器才能有效地生成纹理。所以理想情况下,我不想为应该像在四边形上渲染纹理一样简单的东西使用着色器。尽管该程序广泛使用着色器。
我尝试使用 GLubyte 将数据传递给 glTexImage2D,但得到了相同的结果。我还尝试了各种位置来调用 glEnable(GL_TEXTURE_2D)、glBindTexture、glTexParameteri 和 glTexImage2D。 此外,我评论了 glTexEnvf、glBindTexture(解除绑定)、glDisable(GL_TEXTURE_2D) 和 glDeleteTextures(...)。 结果都一样。
也许在同样使用着色器的程序中不能使用固定管线纹理渲染?还是我的代码有误?据我所知,根据 Google,下面的代码应该在四边形上渲染纹理。它困扰了我几天,可能是一个简单的错误...
glGetError returns 代码段中所有位置均为 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;
我应该在我的问题中提到我希望纹理显示在屏幕上(2D)。
一位同事能够帮助我并建议使用 glDrawPixels,它可以在不禁用着色器的情况下工作 运行(我不知道必须禁用它们,因为大多数固定管道的东西似乎都可以工作,所以谢谢 Bahbar)。