2017-06-28 268 views
1

我正在做一些開始與LibGDX着色器的工作。我試圖手動設置顏色,但所有我都是白色的。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.0, 1.0); 
} 

,你可以看到極其簡單。有了這個設置,我可以繪製形狀,但它們總是呈白色。用我的片段着色器,我希望所有的東西都是紅色的。

我缺少libgdx堆棧中的東西嗎?某些libgdx着色器的默認值或某些東西會被鏈接進一步覆蓋?

屏幕輸出: Should be red, is white no matter what I do

+0

如何在代碼中使用着色器程序? 「我能繪製形狀」是什麼意思,它是網狀的嗎? – Aryan

+0

我正在嘗試不使用網格。這可能是不可能的......試圖在不使用Mesh的情況下理解底層函數。如果我今天拿不到它,我會放入網格。 –

+0

另外,我沒有做的一件事是運行ShaderProgram.begin()。當我這樣做時,頂點完全消失。我看你沒有在你的代碼中使用begin(),所以這可能不是必需的,或者當你啓動一個SpriteBatch時自動發生。儘管感謝指針。 –

回答

1

不知怎的,你需要通過頂點的OpenGL所以有Mesh類此要求LibGDX。我正在使用擁有自己的網格的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(); 
    } 
} 

並且輸出是:

enter image description here

編輯

網是什麼,它只是頂點的大陣列,包含要求的OpenGL和一個頂點可以保存有關PositionColorTexture Coordinates,或者我們想其他任何價值傳遞給着色器。

根據您的問題,您在紅色的片段着色器中固定顏色,因此您只需要將顏色位置傳遞給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; 
    } 
} 
+0

是的,我正在嘗試沒有spritebatch或網格。但是,這可能會試圖打擊框架太多。感謝您的提醒! –

+0

感謝關於ShaderProgram.pedantic的小塊,以及......不知道那個。 –

+0

@ether_joe我更新了我的答案,請檢查,以及'ShaderProgram。「迂迴」只是一個標誌,表示屬性和制服是否必須始終存在於「SpriteBatch」 – Aryan