Map and fill texture using PBO (OpenGL 3.3)
Posted
by
NtscCobalt
on Game Development
See other posts from Game Development
or by NtscCobalt
Published on 2012-09-03T20:35:21Z
Indexed on
2012/09/03
21:49 UTC
Read the original article
Hit count: 326
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;
}
© Game Development or respective owner