Search code examples
javaopenglglsljmonkeyengine

GLSL compile error from JMonkey SimpleApplication


Using JMonkeyEngine, I’ve created a very simple subclass of SimpleApplication but I’m getting a very strange error with no idea what’s causing it. What’s more, this used to work just fine, but it seems something has changed on my system that is breaking it. A new workspace runs this code just fine on a coworker’s computer.

I get a ‘bad compile’ message which prints out a concatenation of the files Common/ShaderLib/Skinning.glsllib and Common/MatDefs/Misc/Unshaded.vert. (As a result of preprocessor copy-pasting).

The error says I’m missing a ‘#version’ at the top of the file. Of course, I haven’t changed the file. My understanding is that the GLSL compiler should interpret files with no specified version as being version 110.

The second complaint is about a syntax error on ‘attribute,’ line 76. I don’t see anything wrong here.

I’ve tried specifying the version of OpenGL to use via AppSettings, but that seems to have no effect.

When I run the code through the debugger I see that there is a string ‘language’ set to “GLSL100″ but also an int ‘version’ set to 150. This is in LwjglRenderer.

Jun 03, 2014 9:03:29 AM com.jme3.renderer.lwjgl.LwjglRenderer updateShaderSourceData
WARNING: Bad compile of:
1   #define HAS_COLOR 1
2   #ifdef NUM_BONES
3   
4   #if NUM_BONES < 1 || NUM_BONES > 255
5   #error NUM_BONES must be between 1 and 255.
6   #endif
7   
8   #define NUM_WEIGHTS_PER_VERT 4
9    
10  attribute vec4 inHWBoneWeight;
11  attribute vec4 inHWBoneIndex;
12  uniform mat4 m_BoneMatrices[NUM_BONES];
13  
14  void Skinning_Compute(inout vec4 position){
15      if (inHWBoneWeight.x != 0.0) {
16  #if NUM_WEIGHTS_PER_VERT == 1
17          position = m_BoneMatrices[int(inHWBoneIndex.x)] * position;
18  #else
19          mat4 mat = mat4(0.0);
20          mat += m_BoneMatrices[int(inHWBoneIndex.x)] * inHWBoneWeight.x;
21          mat += m_BoneMatrices[int(inHWBoneIndex.y)] * inHWBoneWeight.y;
22          mat += m_BoneMatrices[int(inHWBoneIndex.z)] * inHWBoneWeight.z;
23          mat += m_BoneMatrices[int(inHWBoneIndex.w)] * inHWBoneWeight.w;
24          position = mat * position;
25  #endif
26      }
27  }
28   
29  void Skinning_Compute(inout vec4 position, inout vec3 normal){
30      if (inHWBoneWeight.x != 0.0) {
31  #if NUM_WEIGHTS_PER_VERT == 1
32          position = m_BoneMatrices[int(inHWBoneIndex.x)] * position;
33          normal = (mat3(m_BoneMatrices[int(inHWBoneIndex.x)][0].xyz,
34                         m_BoneMatrices[int(inHWBoneIndex.x)][1].xyz,
35                         m_BoneMatrices[int(inHWBoneIndex.x)][2].xyz) * normal);
36  #else
37          mat4 mat = mat4(0.0);
38          mat += m_BoneMatrices[int(inHWBoneIndex.x)] * inHWBoneWeight.x;
39          mat += m_BoneMatrices[int(inHWBoneIndex.y)] * inHWBoneWeight.y;
40          mat += m_BoneMatrices[int(inHWBoneIndex.z)] * inHWBoneWeight.z;
41          mat += m_BoneMatrices[int(inHWBoneIndex.w)] * inHWBoneWeight.w;
42          position = mat * position;
43  
44          mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz);
45          normal = rotMat * normal;
46  #endif
47      }
48  }
49   
50  void Skinning_Compute(inout vec4 position, inout vec3 tangent, inout vec3 normal){
51      if (inHWBoneWeight.x != 0.0) {
52  #if NUM_WEIGHTS_PER_VERT == 1
53          position = m_BoneMatrices[int(inHWBoneIndex.x)] * position;
54          tangent = m_BoneMatrices[int(inHWBoneIndex.x)] * tangent;
55          normal = (mat3(m_BoneMatrices[int(inHWBoneIndex.x)][0].xyz,
56                         m_BoneMatrices[int(inHWBoneIndex.x)][1].xyz,
57                         m_BoneMatrices[int(inHWBoneIndex.x)][2].xyz) * normal);
58  #else
59          mat4 mat = mat4(0.0);
60          mat += m_BoneMatrices[int(inHWBoneIndex.x)] * inHWBoneWeight.x;
61          mat += m_BoneMatrices[int(inHWBoneIndex.y)] * inHWBoneWeight.y;
62          mat += m_BoneMatrices[int(inHWBoneIndex.z)] * inHWBoneWeight.z;
63          mat += m_BoneMatrices[int(inHWBoneIndex.w)] * inHWBoneWeight.w;
64          position = mat * position;
65  
66          mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz);
67          tangent = rotMat * tangent;
68          normal = rotMat * normal;
69  #endif
70      }
71  }
72  
73  #endif
74  
75  uniform mat4 g_WorldViewProjectionMatrix;
76  attribute vec3 inPosition;
77  
78  #if defined(HAS_COLORMAP) || (defined(HAS_LIGHTMAP) && !defined(SEPARATE_TEXCOORD))
79      #define NEED_TEXCOORD1
80  #endif
81  
82  attribute vec2 inTexCoord;
83  attribute vec2 inTexCoord2;
84  attribute vec4 inColor;
85  
86  varying vec2 texCoord1;
87  varying vec2 texCoord2;
88  
89  varying vec4 vertColor;
90  
91  void main(){
92      #ifdef NEED_TEXCOORD1
93          texCoord1 = inTexCoord;
94      #endif
95  
96      #ifdef SEPARATE_TEXCOORD
97          texCoord2 = inTexCoord2;
98      #endif
99  
100     #ifdef HAS_VERTEXCOLOR
101         vertColor = inColor;
102     #endif
103 
104     vec4 modelSpacePos = vec4(inPosition, 1.0);
105     #ifdef NUM_BONES
106         Skinning_Compute(modelSpacePos);
107     #endif
108     gl_Position = g_WorldViewProjectionMatrix * modelSpacePos;
109 }

Jun 03, 2014 9:03:29 AM com.jme3.app.Application handleError
SEVERE: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Common/MatDefs/Misc/Unshaded.vert, defines, type=Vertex, language=GLSL100] error:ERROR: 0:1: '' :  #version required and missing.
ERROR: 0:76: 'attribute' : syntax error syntax error
�
    at com.jme3.renderer.lwjgl.LwjglRenderer.updateShaderSourceData(LwjglRenderer.java:1018)
    at com.jme3.renderer.lwjgl.LwjglRenderer.updateShaderData(LwjglRenderer.java:1041)
    at com.jme3.renderer.lwjgl.LwjglRenderer.setShader(LwjglRenderer.java:1107)
    at com.jme3.material.Material.render(Material.java:1116)
    at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
    at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:322)
    at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:371)
    at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:788)
    at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:719)
    at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:983)
    at com.jme3.renderer.RenderManager.render(RenderManager.java:1035)
    at com.jme3.app.SimpleApplication.update(SimpleApplication.java:252)
    at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
    at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:185)
    at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:228)
    at java.lang.Thread.run(Thread.java:744)

And here's my code:

import com.jme3.app.SimpleApplication;

public class VerySimpleApplication
    extends SimpleApplication
{

    @Override
    public void simpleInitApp()
    {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args)
    {
        VerySimpleApplication app = new VerySimpleApplication();

        app.start();
    }

}

Solution

  • OK, so the issue was that I was using OpenGL 3 by default when I needed to use OpenGL 2.

    VerySimpleApplication app = new VerySimpleApplication();
    AppSettings settings = new AppSettings(true);
    settings.setRenderer(AppSettings.LWJGL_OPENGL2);
    app.setSettings(settings);
    app.start();
    

    Answer to the question on JMonkey forum.