我是Shaders的新手,也是OpenGL的新手。在阅读了一些教程之后,我决定创建我的第一个着色器(使用LibGDX)。
问题是屏幕完全是黑色......
我的Java代码:
public class Application extends
ApplicationAdapter {
private ShaderProgram mShaderProgram;
private Mesh mMesh;
@Override
public void create() {
this.createMesh();
if (Gdx.graphics.isGL20Available()) {
this.createShaderProgram();
}
this.log("" + this.mShaderProgram.isCompiled()); // outputs "true"
}
private void createMesh() {
this.mMesh = new Mesh(true, 3, 4, VertexAttribute.Position());
this.mMesh.setIndices(new short[] { 0, 1, 2 });
this.mMesh.setVertices(new float[] {
-0.5f, -0.5f, 0,
0f, 0.5f, 0,
0.5f, -0.5f, 0
});
}
private void createShaderProgram() {
final FileHandle fragmentShader = Gdx.files.internal("fragment.txt");
final FileHandle vertexShader = Gdx.files.internal("vertex.txt");
this.mShaderProgram = new ShaderProgram(vertexShader, fragmentShader);
}
@Override
public void dispose() {
this.mMesh.dispose();
if (this.mShaderProgram != null) {
this.mShaderProgram.dispose();
}
}
private void log(final String message) {
Gdx.app.log("", message);
}
@Override
public void render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
if (Gdx.graphics.isGL20Available()) {
this.mShaderProgram.begin();
this.mMesh.render(this.mShaderProgram, GL10.GL_TRIANGLES);
this.mShaderProgram.end();
}
else {
this.mMesh.render(GL10.GL_TRIANGLES);
}
}
}
我的片段着色器:
void main() {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
我的顶点着色器:
void main() {
gl_Position = ftransform();
}
使用gl_Vertex
代替ftransform()
并没有改变任何内容。
答案 0 :(得分:1)
您没有看到任何内容的原因是因为您的顶点着色器不执行任何操作。为了使代码正常工作,您需要至少执行以下操作:
顶点着色器:
#ifdef GL_ES
precision mediump float;
#endif
attribute vec4 a_position;
void main()
{
gl_Position = a_position;
}
我建议您查看一些着色器教程,以便更好地了解着色器在OpenGL ES中的工作原理。
要快速解释上述着色器代码,请在网格中设置“a_position”属性的顶点属性。顶点着色器只是将该位置信息传递给片段着色器。然后片段着色器将白色分配给要渲染的所有片段。
答案 1 :(得分:0)
搜索网页后,我发现了一些GLSL内置属性&新版本的GLSL中不推荐使用gl_Vertex
和ftransform()
等函数。
我不知道现在你必须注册位置&你自己的颜色属性。