【发布时间】:2019-09-17 04:44:32
【问题描述】:
我正在尝试使用来自 OpenGL 的纹理单元将图像写入屏幕。如您所见,我在 tex Sampler2D 中写入了 0,因为我使用的是第 0 个纹理单元。我还将顶点和纹理作为矩形。我检查了 gl 错误,没有。我还将 FragColor 更改为vec4(1.0, 0, 0, 1.0);,我确实看到了红色图像,这意味着我的坐标是正确的。
这是我的代码:
static unsigned char * d = new unsigned char[640*360*4];
const GLfloat vertices_textures[20] = {
//vertices //positions
-1.0f, -1.0f, 0.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f, 1.0f, 0.0f};
if (this->firstRun)
{
int i;
for (i = 0; i < 640*360*4; ++i)
{
d[i] = 255;
}
program = std::make_unique<Program>();
Shader vertexShader(ShaderType::Vertex);
vertexShader.load_from_string(vertexShaderSource);
program->attach_shader(vertexShader);
Shader fragmentShader(ShaderType::Fragment);
fragmentShader.load_from_string(fragmentShaderSource);
program->attach_shader(fragmentShader);
program->link();
vextexInLocation = glGetAttribLocation(program->get_id(), "aPos");
textureInLocation = glGetAttribLocation(program->get_id(), "aTexCoord");
glGenVertexArrays(1, &vertexArrayObject);
glBindVertexArray(vertexArrayObject);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_textures), vertices_textures, GL_STATIC_DRAW);
glVertexAttribPointer(vextexInLocation, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void *)0);
glEnableVertexAttribArray(vextexInLocation);
glVertexAttribPointer(textureInLocation, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void *)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(textureInLocation);
glActiveTexture(GL_TEXTURE0);
texLocation = glGetUniformLocation(program->get_id(), "tex");
program->use();
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 640, 360, 0, GL_RED, GL_UNSIGNED_BYTE, d);
firstRun = false;
}
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUniform1i(texLocation, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);
glBindVertexArray(vertexArrayObject);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
这是我的着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
out vec2 TexCoord;
void main()
{
gl_Position = vec4(aPos, 1.0);
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}
和
#version 330 core
out vec4 FragColor;
in vec2 TexCoord;
uniform sampler2D tex;
void main()
{
FragColor = texture(tex, TexCoord);
}
【问题讨论】: