OpenGL glReadPixels returns 0
OpenGL glReadPixels returns 0
当我呈现到屏幕缓冲区时,一切都很好,但是当从glreadpixels读取framebuffer的像素时,它总是会返回0。
伪代码如下:
将纹理绑定到Framebuffer:
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
int width, height;
width = 2;
height = 2;
float texture_data[] = {
1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f
};
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, texture_data);
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
GLint texture_coord_attribute = glGetAttribLocation(program, "texture_coord");
glEnableVertexAttribArray(texture_coord_attribute);
glVertexAttribPointer(texture_coord_attribute, 2, GL_FLOAT, GL_FALSE,
sizeof(vertices[0]), (void*)(sizeof(float) * 5));
fragment/vertex着色器:
static const char* vertex_shader_text =
"#version 330n""
"attribute vec2 vPos;n"
"attribute vec2 texture_coord;n"
"varying vec2 Texcoord;n"
"void main()n"
"{n"
" gl_Position = vec4(vPos, 0.0, 1.0);n"
" Texcoord = texture_coord;n"
"}n";
static const char* fragment_shader_text =
"#version 330n"
"varying vec2 Texcoord;n"
"uniform sampler2D tex;n"
"void main()n"
"{n"
" gl_FragColor = texture(tex, Texcoord);n"
"}n";
在主循环中读取像素:
glViewport(0, 0, 720, 480);
glUseProgram(program);
glDrawArrays(GL_TRIANGLES, 0, 6);
GLubyte pixels[3] = {0};
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(360, 240, 1, 1, GL_RGB, GL_FLOAT, pixels);
// Any value returns 0 not only 360 and 240
printf("|%f||%f||%f|n", pixels[0], pixels[1], pixels[2]);
glfwSwapBuffers(window);
glfwPollEvents();
这是我遵循的管道。这里怎么了?谢谢。
glReadPixels
的第5和第6个参数(format
和type
(指定 target Pixel Data的格式和数据类型。
由于您想阅读使用元素数据类型GLubyte
的缓冲区,因此该类型必须为GL_BYTE
。
这样更改您的代码:
glReadPixels(360, 240, 1, 1, GL_RGB, GL_BYTE, pixels);
或将数据读取到类型GLfloat
的缓冲区:
GLfloat pixels[3];
glReadPixels(360, 240, 1, 1, GL_RGB, GL_FLOAT, pixels);
请注意,您要做的就是将12个字节(sizeof(float)*3
(读取为3个字节(GLubyte pixels[3]
(的缓冲区。这意味着代表红色通道的浮点值的一部分存储到缓冲区中。其余的覆盖了一些内存,而访问不良。
相关文章:
- CreateWICTextureFromFile returns E_NOINTERFACE
- cl::Event::waitForEvents returns -7 (CL_EXEC_STATUS_ERROR_ F
- vector[0].getPosition() returns 0
- glReadPixels() 不返回抗锯齿图片
- CreateInputLayout returns E_INVALIDARG
- ldap_search_s returns LDAP_OPERATIONS_ERROR
- CreateCompatibleDC(IntPtr.Zero) returns IntPtr.Zero
- glUniformLocation returns -1
- DirectX9 CreateOffscreenPlainSurface returns D3DERR_INVALIDC
- OpenGL glReadPixels returns 0
- gdk_screen_get_default() returns null
- 使用glReadPixels时是否可以不固定数据?
- UIAutomation: AddAutomationEventHandler() returns E_INVALIDA
- C++ _snprintf returns -1
- CryptHashData returns ERROR_INVALID_PARAMETER (CAPI)
- FindClass returns null
- 使用GlreadPixels()opengl es读取浮动值
- QEnableSharedFromThis::sharedFromThis() returns nullptr
- SDL_ttf TTF_OpenFont returns NULL
- GL_32F and glReadPixels