Sto cercando di capire gli shader usando libgdx, provenienti da uno sfondo XNA/HLSL. Sto cercando di ottenere una coppia shader vert/frag per riprodurre l'output che ottengo senza uno shader, ma non visualizza nulla. creazioneshader libgdx - shader di base, ma lo schermo è vuoto
Shader:
void SetupShader()
{
ShaderProgram.pedantic = false;
shader = new ShaderProgram(
Gdx.files.internal("assets/default.vert").readString(),
Gdx.files.internal("assets/default.frag").readString());
if(!shader.isCompiled()) {
Gdx.app.log("Problem loading shader:", shader.getLog());
}
batch.setShader(shader);
}
default.vert:
attribute vec4 a_Position;
attribute vec4 a_Normal;
attribute vec2 a_TexCoord;
attribute vec4 a_Color;
uniform mat4 u_projTrans;
varying vec2 v_texCoords;
varying vec4 v_color;
void main() {
v_color = a_Color;
v_texCoords = a_TexCoord;
gl_Position = u_projTrans * a_Position;
}
default.frag:
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoords;
varying vec4 v_color;
void main() {
gl_FragColor = v_color;
}
Rendering:
batch.begin();
for (GameObject gObj : gameObjects)
gObj.Draw(batch);
batch.end();
Qualche suggerimento qui? Sono nuovo anche per OpenGL-ES, quindi potrei mancare qualcosa di ovvio. Mi sono guardato un po 'prima di postare e il documento per SpriteBatch.setShader(ShaderProgram)
era il seguente:
Imposta lo shader da utilizzare in un ambiente GLES 2.0. L'attributo posizione vertice si chiama "a_position", l'attributo delle coordinate texture è chiamato "a_texCoords0" chiamato, l'attributo color è chiamato "a_color". Vedere ShaderProgram.POSITION_ATTRIBUTE, ShaderProgram.COLOR_ATTRIBUTE e ShaderProgram.TEXCOORD_ATTRIBUTE che ottiene "0" applicato a indicano l'uso della prima unità di trama. La matrice di proiezione è caricata tramite una uniforme mat4 denominata "u_proj", la matrice di trasformazione è caricata tramite un'uniforme chiamata "u_trans", la trasformata combinata e la matrice di proiezione viene caricata tramite un'uniforme mat4 denominata "u_projTrans". Il campionatore di texture viene passato tramite un'uniforme chiamata "u_texture". Chiamare questo metodo con un argomento null per utilizzare lo shader predefinito .
Hmm, la specifica GLSL contiene: 'In generale, l'uso del linguaggio questo set di caratteri è case sensitive. Questo significa che gli identificatori sono case sensitive? La sezione Identificatori non contiene una parola a riguardo. (il vertex shader contiene 'a_Position', il commento' a_position') –
Sì, sembra che tu abbia ragione. Ho verificato come 'SpriteBatch' crea il suo shader, ed era principalmente un problema di maiuscole. Ho anche capito quali sono gli shader predefiniti - li posterò qui sotto. – NumberOverZero