我正在开发一个应用程序的插件,要求我使用OpenGL 2.1。因此,我使用固定功能并进行调试,我目前正在使用立即模式绘图。我没有使用任何着色器。
我尝试生成一些简单的地形,并使用一维渐变纹理对其进行纹理处理,其中地形的高度决定了从纹理中选择的颜色。
我所看到的是纹理根本没有应用于几何体,但我不明白为什么。
以下是我如何设置纹理:
// Set up gradient
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
glDisable(GL_TEXTURE_RECTANGLE_ARB);
glEnable(GL_TEXTURE_1D);
GLuint gradTex = 0;
glGenTextures(1, &gradTex);
glBindTexture(GL_TEXTURE_1D, gradTex);
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, 256, 0, GL_RGBA, GL_FLOAT, samples);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_R, GL_REPEAT);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
CheckGLError();
我已经验证通过在OS X上使用OpenGL Profiler来检查梯度纹理是否已正确上传。所以我认为这意味着问题在于我在绘制时如何绘制几何图形或其他一些状态集。这是绘图代码:
glColor4f(1.0, 1.0, 1.0, 1.0);
glBegin(GL_QUADS);
int x, y;
for (y = 0; y < 32; y++)
{
for (x = 0; x < 32; x++)
{
float nextTexCoord = mesh [ y ][ x ].y + 0.5;
glColor4f(nextTexCoord, nextTexCoord, nextTexCoord, 1.0);
glTexCoord1d(nextTexCoord);
glVertex3d(mesh [ y ][ x ].x, mesh [ y ][ x ].y * height, mesh [ y ][ x ].z);
nextTexCoord = mesh [ y ][ x + 1 ].y + 0.5;
glColor4f(nextTexCoord, nextTexCoord, nextTexCoord, 1.0);
glTexCoord1d(nextTexCoord);
glVertex3d(mesh [ y ][ x + 1 ].x, mesh [ y ][ x + 1 ].y * height, mesh [ y ][ x + 1 ].z);
nextTexCoord = mesh [ y + 1 ][ x + 1 ].y + 0.5;
glColor4f(nextTexCoord, nextTexCoord, nextTexCoord, 1.0);
glTexCoord1d(nextTexCoord);
glVertex3d(mesh [ y + 1 ][ x + 1 ].x, mesh [ y + 1 ][ x + 1 ].y * height, mesh [ y + 1 ][ x + 1 ].z);
nextTexCoord = mesh [ y + 1 ][ x ].y + 0.5;
glColor4f(nextTexCoord, nextTexCoord, nextTexCoord, 1.0);
glTexCoord1d(nextTexCoord);
glVertex3d(mesh [ y + 1 ][ x ].x, mesh [ y + 1 ][ x ].y * height, mesh [ y + 1 ][ x ].z);
}
}
glEnd();
CheckGLError();
为了确保我的纹理坐标是正确的,我用它们的纹理坐标为顶点着色。纹理坐标似乎是正确的 - 它们从0变为1,我的模型从预期变为黑色到白色。我的渐变中没有白色,灰色或黑色,但我的模型显示为灰色阴影。我究竟做错了什么?对glGetError()
的调用不会返回任何错误。
答案 0 :(得分:1)
我明白了。事实证明,不设置min / mag过滤器会导致此问题。加上这个:
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
它开始工作了。我不知道为什么会有所作为,但显然确实如此!