OpenGL如何使用整数纹理

问题描述 投票:0回答:1

我正在尝试绘制一个带有像素为 32 位

unsigned int
rgba 纹理的四边形。纹理不会被绘制。这是一个黑屏。我认为这与着色器和
glTexImage2D
调用有关;因为四边形可以用静态颜色绘制,所以 uv 是正确的,纹理是正确的,但是
texture(tex, uv)
得到
(0,0,0,0)
。我不明白为什么OpenGL无法获取纹理数据。

着色器

vertex_shader[0] = "#version 330 core\n\
layout(location = 0) in vec3 pos;\n\
layout(location = 1) in vec2 uv;\n\
\n\
out vec2 outuv;\n\
\n\
void main(){\n\
    gl_Position = vec4(pos, 1.0);\n\
    outuv = uv;\n\
}\n";

fragment_shader[0] = "#version 330 core\n\
uniform usampler2D tex;\n\
in vec2 uv;\n\
out uvec4 color;\n\
\n\
void main(){\n\
    color = texture(tex, uv);\n\
}\n";

给纹理上色

unsigned int *Screen_image;
for (int now_y=0; now_y<View_height; now_y++) {
    for (int now_x=0; now_x<View_width; now_x++) {
        Screen_image[now_y*View_width + now_x] = 0xFFFFFFFF;
    }
}

创建一个四边形来填充视口。

int vertc = 6;
SVertex vertices[vertc] = {
    {{-1.0f,  1.0f, 0.0f},   {0.0f, 1.0f}},    // top left 
    {{-1.0f, -1.0f, 0.0f},   {0.0f, 0.0f}},   // bottom left
    {{1.0f, 1.0f, 0.0f},   {1.0f, 1.0f}},   // top right
    {{1.0f, 1.0f, 0.0f},   {1.0f, 1.0f}},   // top right
    {{-1.0f, -1.0f, 0.0f},   {0.0f, 0.0f}},   // bottom left
    {{1.0f, -1.0f, 0.0f},   {1.0f, 0.0f}}   // bottom right
};

创建缓冲区

glGenVertexArrays(1, &Vao);
glBindVertexArray(Vao);
/*buffer*/  
glGenBuffers(1, &Vbo);
glBindBuffer(GL_ARRAY_BUFFER, Vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(SVertex)*vertc, vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(SVertex), (void*)(0));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(SVertex), (void*)(sizeof(GLfloat)*3));
/*texture*/
Program1 = LoadShaders();
glGenTextures(1, &Tbo);
glBindTexture(GL_TEXTURE_2D, Tbo);
glActiveTexture(GL_TEXTURE0);
glUseProgram(Program1);
glUniform1i(glGetUniformLocation(Program1, "tex"), 0);

发送纹理并绘制四边形

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, View_width, View_height, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_8_8_8_8, Screen_image);
glDrawArrays(GL_TRIANGLES, 0, 6);

c++ opengl glsl
1个回答
0
投票

哪些像素是 32 位 unsigned int rgba。

您不应该将其作为整数纹理上传。您需要一个标准化整数图像格式

GL_RGBA8
,而不是
GL_RGBA8UI
。采样器类型应该是
sampler2D
。输出颜色应为
vec4
(输出图像也应使用
GL_RGBA8
)。

© www.soinside.com 2019 - 2024. All rights reserved.