我有接下来的两个着色器: 顶点着色器:
/// fragment shader
#version 130
in vec2 vs_uv;
out vec4 fs_color;
uniform sampler2D u_source;
uniform sampler2D u_map;
void main() {
fs_color = vec4(vs_uv, 0, 1);
}
/// vertex shader
#version 130
out vec2 vs_uv;
void main() {
const vec4 vertices[4] = {
vec4(-1, -1, 0, 1),
vec4(-1, 1, 0, 0),
vec4(1, 1, 1, 0),
vec4(1, -1, 1, 1)
};
vec4 description = vertices[gl_VertexID];
gl_Position = vec4(description.xy, 0, 1);
vs_uv = description.zw;
}
显然,它渲染了一个全屏渐变填充的矩形。 我用这两个着色器创建了一个程序,并将 4 个顶点渲染到帧缓冲区中,并从中返回渲染的颜色纹理:
public Texture apply(Texture source, Texture map) {
m_renderBuffer.begin();
Gdx.gl20.glClear(Gdx.gl20.GL_COLOR_BUFFER_BIT);
m_program.begin();
m_program.setUniformi(m_sourceLocation, 0);
m_program.setUniformi(m_mapLocation, 1);
Gdx.gl20.glDrawArrays(Gdx.gl20.GL_TRIANGLE_FAN, 0, 4);
m_program.end();
m_renderBuffer.end();
return m_renderBuffer.getColorBufferTexture();
}
我使用 SpriteBatch 绘制渲染纹理:
m_lightSpriteBatch.begin();
m_lightSpriteBatch.draw(lightTexture, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
m_lightSpriteBatch.end();
它运行良好,可以按照我的需要渲染渐变填充的矩形。当我在程序开始后绑定(bind)两个纹理(作为 apply
方法的参数传递 - source
和 map
)时:
m_program.begin();
source.bind(0);
map.bind(1);
...
- 没有纹理绑定(bind)渲染的纹理
源
纹理- 渲染纹理“蹩脚”
贴图
纹理
最佳答案
OpenGL 规范规定,将帧缓冲区的附加纹理渲染到其自己的帧缓冲区上会产生未定义的结果。或者用你的话来说“废话”。 :) 我想这表明至少在这个特定的 GPU 上,您甚至无法绑定(bind)纹理,更不用说从中获取样本了。
通常,如果您需要做这样的事情,您需要两个 FrameBuffer,并且您可以在它们之间进行乒乓球操作。
关于java - LibGDX OpenGL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38851962/