Skip to content

Commit

Permalink
🔧 Copy GUI buffer to texture
Browse files Browse the repository at this point in the history
  • Loading branch information
Schneegans committed Jan 28, 2025
1 parent dc14b56 commit 9bea16c
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 37 deletions.
27 changes: 22 additions & 5 deletions src/cs-gui/GuiItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,12 @@ GuiItem::GuiItem(std::string const& url, bool allowLocalFileAccess)
mBufferData = static_cast<uint8_t*>(glMapBufferRange(GL_TEXTURE_BUFFER, 0, bufferSize, flags));

glGenTextures(1, &mTexture);

glBindTexture(GL_TEXTURE_BUFFER, mTexture);
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA8, mTextureBuffer);
glBindTexture(GL_TEXTURE_2D, mTexture);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, getWidth(), getHeight());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindBuffer(GL_TEXTURE_BUFFER, 0);
glBindTexture(GL_TEXTURE_BUFFER, 0);
Expand Down Expand Up @@ -232,8 +235,14 @@ uint8_t* GuiItem::updateTexture(DrawEvent const& event) {
glBufferStorage(GL_TEXTURE_BUFFER, bufferSize, nullptr, flags);
mBufferData = static_cast<uint8_t*>(glMapBufferRange(GL_TEXTURE_BUFFER, 0, bufferSize, flags));

glBindTexture(GL_TEXTURE_BUFFER, mTexture);
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA8, mTextureBuffer);
glDeleteTextures(1, &mTexture);
glGenTextures(1, &mTexture);
glBindTexture(GL_TEXTURE_2D, mTexture);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, event.mWidth, event.mHeight);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindBuffer(GL_TEXTURE_BUFFER, 0);
glBindTexture(GL_TEXTURE_BUFFER, 0);
Expand Down Expand Up @@ -298,6 +307,14 @@ void GuiItem::updateSizes() {
////////////////////////////////////////////////////////////////////////////////////////////////////

uint32_t GuiItem::getTexture() const {

// Copy the texture buffer to the texture.
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, mTextureBuffer);
glBindTexture(GL_TEXTURE_2D, mTexture);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getWidth(), getHeight(), GL_BGRA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

return mTexture;
}

Expand Down
13 changes: 4 additions & 9 deletions src/cs-gui/ScreenSpaceGuiArea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,18 +52,13 @@ const char* const ScreenSpaceGuiArea::QUAD_FRAG = R"(
in vec2 vTexCoords;
in vec4 vPosition;
uniform samplerBuffer texture;
uniform sampler2D texture;
uniform ivec2 texSize;
layout(location = 0) out vec4 vOutColor;
vec4 getTexel(ivec2 p) {
p = clamp(p, ivec2(0), texSize - ivec2(1));
return texelFetch(texture, p.y * texSize.x + p.x).bgra;
}
void main() {
vOutColor = getTexel(ivec2(vec2(texSize) * vTexCoords));
vOutColor = texelFetch(texture, ivec2(texSize * vTexCoords), 0);
if (vOutColor.a == 0.0) discard;
vOutColor.rgb /= vOutColor.a;
}
Expand Down Expand Up @@ -139,12 +134,12 @@ bool ScreenSpaceGuiArea::Do() {
glUniform2i(mUniforms.texSize, guiItem->getTextureSizeX(), guiItem->getTextureSizeY());

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_BUFFER, guiItem->getTexture());
glBindTexture(GL_TEXTURE_2D, guiItem->getTexture());
mShader.SetUniform(mUniforms.texture, 0);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glBindTexture(GL_TEXTURE_BUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);
}
}

Expand Down
28 changes: 5 additions & 23 deletions src/cs-gui/WorldSpaceGuiArea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,35 +54,17 @@ void main()
const char* const WorldSpaceGuiArea::QUAD_FRAG = R"(
in vec2 vTexCoords;
uniform samplerBuffer texture;
uniform sampler2D texture;
uniform ivec2 texSize;
layout(location = 0) out vec4 vOutColor;
vec4 getTexel(ivec2 p) {
p = clamp(p, ivec2(0), texSize - ivec2(1));
return texelFetch(texture, p.y * texSize.x + p.x).bgra;
}
vec4 getPixel(vec2 position) {
vec2 absolutePosition = position * texSize - 0.5;
ivec2 iPosition = ivec2(absolutePosition);
vec4 tl = getTexel(iPosition);
vec4 tr = getTexel(iPosition + ivec2(1, 0));
vec4 bl = getTexel(iPosition + ivec2(0, 1));
vec4 br = getTexel(iPosition + ivec2(1, 1));
vec2 d = fract(absolutePosition);
vec4 top = mix(tl, tr, d.x);
vec4 bot = mix(bl, br, d.x);
return mix(top, bot, d.y);
return texelFetch(texture, p, 0).bgra;
}
void main() {
vOutColor = getPixel(vTexCoords);
vOutColor = texture2D(texture, vTexCoords);
if (vOutColor.a == 0.0) discard;
vOutColor.rgb /= vOutColor.a;
Expand Down Expand Up @@ -236,12 +218,12 @@ bool WorldSpaceGuiArea::Do() {
glUniform2i(mUniforms.texSize, guiItem->getTextureSizeX(), guiItem->getTextureSizeY());

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_BUFFER, guiItem->getTexture());
glBindTexture(GL_TEXTURE_2D, guiItem->getTexture());
mShader.SetUniform(mUniforms.texture, 0);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glBindTexture(GL_TEXTURE_BUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);
}
}

Expand Down

0 comments on commit 9bea16c

Please sign in to comment.