/ *因为标记为重复:这个问题与OpenGL 2 Texture Internal Formats GL_RGB8I, GL_RGB32UI, etc不同,因为我不会遇到纹理是白色或黑色的问题,一切都在工作时也会解读(拾取),我使用一个通道纹理而不是3/4通道纹理* /
我试图用glReadPixels命令读取无符号整数。 以下代码,使用rgb字节值正常工作,
纹理和帧缓冲初始化
glGenTextures(1, &nTargetTexture);
glBindTexture(GL_TEXTURE_2D, nTargetTexture);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB, nWidth, nHeight);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glGenFramebuffers(1, &nFramebufferID);
glBindFramebuffer(GL_FRAMEBUFFER, nFramebufferID);
pglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, nTargetTexture, 0);
const GLenum draw_buffers[] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, draw_buffers);
GLenum eFramebufferOk = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
GLError();
switch (eFramebufferOk)
{
case GL_FRAMEBUFFER_UNDEFINED:
{
DebugAssertOnce(CREATE_FRAME_BUFFER_FAILED);
}
break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
{
DebugAssertOnce(CREATE_FRAME_BUFFER_FAILED);
}
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
{
DebugAssertOnce(CREATE_FRAME_BUFFER_FAILED);
}
break;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
{
DebugAssertOnce(CREATE_FRAME_BUFFER_FAILED);
}
break;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
{
DebugAssertOnce(CREATE_FRAME_BUFFER_FAILED);
}
break;
case GL_FRAMEBUFFER_UNSUPPORTED:
{
DebugAssertOnce(CREATE_FRAME_BUFFER_FAILED);
}
break;
case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
{
DebugAssertOnce(CREATE_FRAME_BUFFER_FAILED);
}
break;
case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
{
DebugAssertOnce(CREATE_FRAME_BUFFER_FAILED);
}
break;
case GL_FRAMEBUFFER_COMPLETE:
{
}
break;
default:
{
DebugAssertOnce(CREATE_FRAME_BUFFER_FAILED);
}
break;
}
一个简单的测试片段着色器
#version 430 core
layout(location = 0) out vec3 colorPickOutput;
void main (void)
{
colorPickOutput= vec3(1,0.5f,0);
}
这个片段着色器正在工作:为了测试它,我将它打印到GL_BACK缓冲区。
从Framebuffer中读取
glBindFramebuffer(GL_FRAMEBUFFER, nFramebufferID);
GLubyte result[3];
glReadPixels(static_cast<int>(x), static_cast<int>(y),1, 1, GL_RGB, GL_UNSIGNED_BYTE, &result);
但是,如果您要选择最多256 ^ 3个对象,则此代码仅有用。 我尝试使用GL_R32UI纹理运行此代码以将可拾取项目的最大值设置为2 ^ 32(4.294.967.296),但它仍然无法工作,我替换了以下行:
替换行
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32UI, nWidth, nHeight);
layout(location = 0) out ivec3 /*also tryed uint*/ colorPickOutput;
void main (void)
{
colorPickOutput= ivec3(5,0,0); /*also tryed uint(5);*/
}
GLuint result[1]; //also tryed with result[3]
glReadPixels(static_cast<int>(x), static_cast<int>(y),1, 1, GL_RED/*also tryed with GL_RGB*/, GL_UNSIGNED_INT, &result);
但它给了我&#34; GL_INVALID_OPERATION&#34;如果我使用&#34; glGetError()&#34;命令。
是否可以从纹理中读取一个uint像素? 我可能使用错误的命令来读取uint像素吗?