Java Libgdx-基本着色器不工作
我对着色器和OpenGL都是新手。在阅读了一些教程之后,我决定创建我的第一个着色器(使用LibGDX) 问题是屏幕是全黑的 我的Java代码:Java Libgdx-基本着色器不工作,java,opengl,2d,shader,libgdx,Java,Opengl,2d,Shader,Libgdx,我对着色器和OpenGL都是新手。在阅读了一些教程之后,我决定创建我的第一个着色器(使用LibGDX) 问题是屏幕是全黑的 我的Java代码: public class Application extends ApplicationAdapter { private ShaderProgram mShaderProgram; private Mesh mMesh; @Override p
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();
}
我的片段着色器:
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();
}
我的顶点着色器:
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\u Vertex
而不是ftransform()
不会改变任何东西。没有看到任何东西的原因是顶点着色器没有做任何事情。要使代码正常工作,您至少需要让它执行以下操作:
顶点着色器:
#ifdef GL_ES
precision mediump float;
#endif
attribute vec4 a_position;
void main()
{
gl_Position = a_position;
}
我建议您阅读一些着色器教程,以更好地了解着色器在OpenGL ES中的工作方式
要快速解释上述着色器代码,请在网格中为“a_位置”属性设置顶点属性。顶点着色器只是将该位置信息传递给片段着色器。片段着色器然后将白色指定给所有要渲染的片段。搜索web后,我发现一些GLSL内置属性和函数,如
gl_Vertex
和ftransform()
,在新版本的GLSL中已被弃用
我不知道现在你必须自己注册位置和颜色属性。是的,我在5分钟前的一个教程中找到了这段基本代码,它很有效。但我在一些教程中读到,GLSL具有内置变量,包括保存位置数据(如顶点着色器中的位置)的gl_Vertex,以及模拟先前OpenGL版本固定管道的
ftTransform()
函数(modelViewMatrix*position
)。是否可以使用这些变量而不是创建新变量?这将简化着色器的代码。在片段着色器中输入gl_颜色也有同样的问题。您必须记住OpenGL ES和OpenGL是不同的,并且每个版本都有不同的语言部分。我认为固定管道函数仅对OpenGLES1.x有效,而对OpenGLES2.0/3.0无效。在2.0中,必须将值作为属性或统一变量传入。如果你想在libGDX中找到一个更复杂的例子,你可以参考以下答案:在搜索web之后,我发现一些GLSL内置属性和函数,如gl_Vertex
和ftransform()
,在新版本的GLSL中被弃用。我不知道现在你必须自己注册位置和颜色属性。如果你真的想了解OpenGL ES着色器的详细信息,最有价值的参考是这里的快速参考指南: