2

我正在使用以下方式将主机端纹理上传到 OpenGL:

GLfloat * values = new [nRows * nCols];

// initialize values
for (int i = 0; i < nRows * nCols; ++i)
{
    values[i] = (i % 201 - 100) / 10.0f; // values from -10.0f .. + 10.0f
}

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, nRows, nCols, GL_LUMINANCE, GL_FLOAT, values);

但是,当我使用 glGetTexImage() 读回纹理时,结果发现所有值都被裁剪到 [0..1] 范围内。

首先,我找不到记录此行为的位置(我使用的是 OpenGL 2.1 的红皮书)。

其次,是否可以改变这种行为并让值不变地传递?我想访问 GLSL 着色器中未缩放、未剪辑的数据。

4

1 回答 1

1

我找不到记录此行为的位置

在实际的规范中,它位于 Pixel Rectangles 部分,标题为 Transfer of Pixel Rectangles。

其次,是否可以改变这种行为并让值不变地传递?

是的。如果要使用“未缩放、未固定”的数据,则必须使用浮点图像格式。纹理的格式是在您为其创建存储时定义的,可能是通过调用glTexImage2D. 该函数的第三个参数定义格式。所以使用适当的浮点格式而不是整数格式。

于 2013-05-22T08:30:56.300 回答