Note that there are some explanatory texts on larger screens.

plurals
  1. POLibGDX - Shader working on Desktop but not on Android
    primarykey
    data
    text
    <p>I have written a simple program that renders a sphere in a 3d environment and colores it according to four light sources around the sphere. When I run the program on the desktop it works just fine but on an Android device the sphere is just plain colored.</p> <p>Here are images to illustrate what I am talking about:</p> <p><img src="https://i.stack.imgur.com/gMASW.png" alt="enter image description here"> -> Desktop</p> <p><img src="https://i.stack.imgur.com/Htpjv.png" alt="enter image description here"> -> Android</p> <p>And here is the shader code:</p> <p><strong>sphere.vert</strong></p> <pre><code>#ifdef GL_ES precision mediump float; #endif uniform mat4 u_projectionMatrix; uniform mat3 u_normalMatrix; uniform mat4 u_modelViewMatrix; const int MAX_LIGHTS = 8; uniform int u_lights_active; uniform vec3 u_ambient; uniform vec3 u_position[ MAX_LIGHTS ]; uniform vec3 u_diffuse[ MAX_LIGHTS ]; uniform vec3 u_att_coeffs[ MAX_LIGHTS ]; // since builtins aren't used, we use attributes as substitute attribute vec2 a_texCoord0; attribute vec4 a_position; attribute vec3 a_normal; // outputs to fragment shader varying vec2 v_tex_coord; varying vec4 v_color; void main() { vec3 tempColor = u_ambient; vec3 ecPosition = vec3( u_modelViewMatrix * a_position ); vec3 viewVec = normalize( -ecPosition ); vec3 tnorm = normalize( u_normalMatrix * a_normal ); for ( int i = 0; i &lt; u_lights_active; ++i ) { float dist = length( ecPosition - u_position[i] ); // distance from light to fragment float att = 1.0 / ( u_att_coeffs[i].x + u_att_coeffs[i].y*dist + u_att_coeffs[i].z*dist*dist ); vec3 lightVec = normalize( u_position[i] - ecPosition ); float diffuse = max( dot( lightVec, tnorm ), 0.0 ); tempColor += att * u_diffuse[i] * diffuse; } tempColor = clamp( tempColor, 0.0, 1.0 ); v_color = vec4( tempColor, 0.0 ); gl_Position = u_projectionMatrix * vec4( ecPosition, 1.0 ); v_tex_coord = a_texCoord0.xy; } </code></pre> <p><strong>sphere.frag</strong></p> <pre><code>#ifdef GL_ES precision mediump float; #endif uniform sampler2D u_texture; varying vec2 v_tex_coord; varying vec4 v_color; void main() { vec4 texColor = texture2D( u_texture, v_tex_coord ); gl_FragColor = texColor * v_color; } </code></pre> <p>I really hope that one of you guys can explain to me, what I'm doing wrong.</p> <p><strong>Version Numbers:</strong></p> <p>LibGDX: 0.9.8</p> <p>ADT: Build v22.0.1-685705</p> <p>Android Device: Sony Xperia S, Android 4.1.2</p> <p>Project Build Target: Android 4.3, API 18</p> <p><strong>Mainfest contains</strong></p> <pre><code>&lt;uses-feature android:glEsVersion="0x00020000" android:required="true" /&gt; </code></pre> <p><strong>The shader is created by:</strong></p> <pre><code>shaderProgram = new ShaderProgram( Gdx.files.internal( "shaders/sphere.vert" ), Gdx.files.internal( "shaders/sphere.frag" ) ); if ( !shaderProgram.isCompiled() ) { Gdx.app.error( TAG, shaderProgram.getLog() ); } </code></pre> <p><strong>The sphere is a StillModel:</strong></p> <p><strong>creation:</strong></p> <pre><code>final ModelLoaderHints hint = new ModelLoaderHints( true ); model = ModelLoaderRegistry.loadStillModel( Gdx.files.internal( "data/sphere.obj" ), hint ); texture = new Texture( Gdx.files.internal( "data/sphere_tex.png" ), Format.RGB888, false ); material = new Material( "mat", new TextureAttribute( texture, 0, "u_texture" ) ); </code></pre> <p><strong>rendering:</strong></p> <pre><code>shaderProgram.begin(); texture.bind( 0 ); shaderProgram.setUniformMatrix( C.U_PROJECTION_MATRIX, cam.projection ); // light values shaderProgram.setUniformi( C.U_LIGHTS_ACTIVE, lightsActive ); shaderProgram.setUniform3fv( C.U_LIGHT_AMBIENT, lightAmbient, 0, 3 ); shaderProgram.setUniform3fv( C.U_LIGHT_POSITION, lightPosition, 0, 3 * lightsActive ); shaderProgram.setUniform3fv( C.U_LIGHT_DIFFUSE, lightDiffuse, 0, 3 * lightsActive ); shaderProgram.setUniform3fv( C.U_LIGHT_ATT_COEFFS, lightAttCoeffs, 0, 3 * lightsActive ); modelMatrix.setToTranslation( positionWrap ); modelMatrix.rotate( rotationAxis, rotation ); modelMatrix.scale( scaleX, scaleY, scaleZ ); modelViewMatrix.set( cam.view ).mul( modelMatrix ); normalMatrix.set( modelViewMatrix ).inv().tra(); shaderProgram.setUniformMatrix( C.U_NORMAL_MATRIX, normalMatrix3x3.set( normalMatrix ) ); shaderProgram.setUniformMatrix( C.U_MODEL_VIEW_MATRIX, modelViewMatrix ); stillModel.render( shaderProgram ); shaderProgram.end(); </code></pre> <p>Hope this is all the information needed.</p> <p>Thanks in advance!</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload