使用uint 32bit纹理的颜色选择

时间:2016-05-31 08:01:20

标签: c++ opengl

/ *因为标记为重复:这个问题与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像素吗?

0 个答案:

没有答案