Map and fill texture using PBO (OpenGL 3.3)
- by NtscCobalt
I'm learning OpenGL 3.3 trying to do the following (as it is done in D3D)...
Create Texture of Width, Height, Pixel Format
Map texture memory
Loop write pixels
Unmap texture memory
Set Texture
Render
Right now though it renders as if the entire texture is black.
I can't find a reliable source for information on how to do this though. Almost every tutorial I've found just uses glTexSubImage2D and passes a pointer to memory.
Here is basically what my code does... (In this case it is generating an 1-byte Alpha Only texture but it is rendering it as the red channel for debugging)
GLuint pixelBufferID;
glGenBuffers(1, &pixelBufferID);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pixelBufferID);
glBufferData(GL_PIXEL_UNPACK_BUFFER, 512 * 512 * 1, nullptr, GL_STREAM_DRAW);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 512, 512, 0, GL_RED, GL_UNSIGNED_BYTE, nullptr);
glBindTexture(GL_TEXTURE_2D, 0);
glBindTexture(GL_TEXTURE_2D, textureID);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pixelBufferID);
void *Memory = glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
// Memory copied here, I know this is valid because it is the same loop as in my working D3D version
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
And then here is the render loop.
// This chunk left in for completeness
glUseProgram(glProgramId);
glBindVertexArray(glVertexArrayId);
glBindBuffer(GL_ARRAY_BUFFER, glVertexBufferId);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 20, 0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 20, 12);
GLuint transformLocationID = glGetUniformLocation(3, 'transform');
glUniformMatrix4fv(transformLocationID , 1, true, somematrix)
// Not sure if this is all I need to do
glBindTexture(GL_TEXTURE_2D, pTex->glTextureId);
GLuint textureLocationID = glGetUniformLocation(glProgramId, "texture");
glUniform1i(textureLocationID, 0);
glDrawArrays(GL_TRIANGLES, Offset*3, Triangles*3);
Vertex Shader
#version 330 core
in vec3 Position;
in vec2 TexCoords;
out vec2 TexOut;
uniform mat4 transform;
void main()
{
TexOut = TexCoords;
gl_Position = vec4(Position, 1.0) * transform;
}
Pixel Shader
#version 330 core
uniform sampler2D texture;
in vec2 TexCoords;
out vec4 fragColor;
void main()
{
// Output color
fragColor.r = texture2D(texture, TexCoords).r;
fragColor.g = 0.0f;
fragColor.b = 0.0f;
fragColor.a = 1.0;
}