我正在尝试绘制一个带有像素为 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);