Java libgdx着色器-尝试设置颜色
我正在LibGDX中使用着色器进行一些初步工作。我试图手动设置颜色,但得到的只是白色 顶点着色器:Java libgdx着色器-尝试设置颜色,java,opengl,libgdx,shader,opengl-es-2.0,Java,Opengl,Libgdx,Shader,Opengl Es 2.0,我正在LibGDX中使用着色器进行一些初步工作。我试图手动设置颜色,但得到的只是白色 顶点着色器: attribute vec4 a_position; uniform mat4 u_projTrans; void main() { gl_Position = u_projTrans * a_position; gl_PointSize = 10.0; } 片段着色器: void main() { gl_FragColor = vec4(1.0, 0.0, 0.
attribute vec4 a_position;
uniform mat4 u_projTrans;
void main() {
gl_Position = u_projTrans * a_position;
gl_PointSize = 10.0;
}
片段着色器:
void main()
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
正如你所看到的,非常简单。有了这个设置,我可以画出形状,但它们总是变成白色。用我的碎片着色器,我希望一切都是红色的
我在libgdx堆栈中遗漏了什么吗?是否有东西被某些libgdx着色器默认值或其他东西覆盖
屏幕输出:
不知何故,您需要将顶点传递给OpenGL,以便LibGDX具有满足此要求的
Mesh
类。我使用的是SpriteBatch
,它拥有自己的用于绘制的网格
顶点着色器:
attribute vec4 a_position;
uniform mat4 u_projTrans;
void main()
{
gl_Position = u_projTrans * a_position;
}
片段着色器:
#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
void main()
{
gl_FragColor = vec4(1,0,0,1);
}
ShaderTest
public class ShaderTest extends ApplicationAdapter {
SpriteBatch spriteBatch;
Texture texture;
ShaderProgram shaderProgram;
@Override
public void create() {
spriteBatch=new SpriteBatch();
shaderProgram=new ShaderProgram(Gdx.files.internal("default.vertex.glsl"),Gdx.files.internal("default.fragment.glsl"));
shaderProgram.pedantic = false;
if(shaderProgram.isCompiled()) {
System.out.println("Compiled Successfully");
spriteBatch.setShader(shaderProgram);
}else {
System.out.println("Some Problem in Shader");
}
texture=new Texture("badlogic.jpg");
}
@Override
public void render() {
Gdx.gl.glClearColor(1,1,0,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
spriteBatch.begin();
spriteBatch.draw(texture,100,100);
spriteBatch.end();
}
@Override
public void dispose() {
shaderProgram.dispose();
texture.dispose();
spriteBatch.dispose();
}
}
输出为:
编辑
网格什么都不是,它只是一个大的顶点数组,包含OpenGL所需的值,单个顶点可以保存有关位置
、颜色
、纹理坐标
,或者我们希望传递给着色器的任何其他信息
根据问题,你们在片段着色器中固定了红色的颜色,所以你们只需要将quard的位置传递给OpenGL
public class QuardTest extends ApplicationAdapter {
Mesh quard;
OrthographicCamera cam;
ShaderProgram shaderProgram;
private int Idx = 0;
private float[] verts= new float[4 * 2];
@Override
public void create() {
cam=new OrthographicCamera();
shaderProgram=new ShaderProgram(Gdx.files.internal("default.vertex.glsl"),Gdx.files.internal("default.fragment.glsl"));
if(shaderProgram.isCompiled()) {
System.out.println("Compiled Successfully");
}else {
System.out.println("Some Problem in Shader");
}
quard =new Mesh(true,4,0,new VertexAttribute(VertexAttributes.Usage.Position, 2, "a_position"));
}
@Override
public void render() {
Gdx.gl.glClearColor(1,1,0,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
drawRect(100,100,100,100);
drawRect(250,250,50,50);
}
public void drawRect(float x, float y, float width, float height){
if (Idx ==verts.length) {
flush();
}
verts[Idx++] = x;
verts[Idx++] = y;
verts[Idx++] = x + width;
verts[Idx++] = y;
verts[Idx++] = x + width;
verts[Idx++] = y + height;
verts[Idx++] = x;
verts[Idx++] = y + height;
}
public void flush(){
if (Idx ==0)
return;
quard.setVertices(verts);
Gdx.gl.glDepthMask(false);
int vertexCount = (Idx /2);
cam.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
shaderProgram.begin();
shaderProgram.setUniformMatrix("u_projTrans", cam.combined);
quard.render(shaderProgram, GL20.GL_TRIANGLE_FAN, 0, vertexCount);
shaderProgram.end();
Gdx.gl.glDepthMask(true);
Idx =0;
}
}
如何在代码中使用着色器程序?你说的
是什么意思?我能画形状,是网格吗?我试着在没有网格的情况下画。那可能是不可能的。。。尝试不使用网格来理解较低级别的函数。如果我今天不能得到它,我将在其中放置一个网格。另外,我没有做的一件事是运行ShaderProgram.begin()。当我这样做时,顶点实际上完全消失了。我发现您的代码中没有使用begin(),因此可能不需要使用begin(),或者在启动SpriteBatch时自动使用begin()。不管怎样,谢谢你的指点。是的,我试着不用spritebatch或mesh。但这可能是试图与框架作过多的斗争。谢谢你的提醒!谢谢你关于ShaderProgram.pedantic的小建议。。。我不知道这一点。@ether\u joe我更新了我的答案,请检查,ShaderProgram。pedantic
只是一个标志,指示属性和制服是否必须始终符合SpriteBatch
的要求。是的,我现在在我的代码中包含了一个最小网格。我之前使用的是Java FloatBuffer,并将其与glVertexAttribPointer()一起传递,以了解我的级别有多低。有点愚蠢,但我正在遵循一个非libgdx教程,并对它的工作原理感到好奇。网格应该能把我带到那里。再次感谢!