Shader Model

Hi,

is there a way to ask the graphic adapter, which latest shader model it supports?



Best,

Andreas

Thats an old issue, and there isnt a simple or easy solution to that.



What you can do is, ask OpenGL for different limits, or try to compile shaders and fall back to simpler shader if it wont compile. For example, if the card does not support vertex texture units, you got an SM 2.0 card. If it does not support geometry shaders, then you got an SM 3.0 card. Its not an exact method, but much guesswork. You can query the video card manufacturer and model, and work based on that too.

Ok. How is it possible to test, if the graphic card supports 32 bit floats in the fragment shader?



Andreas

All cards do, or at least, are supposed to. It's in the GLSL spec.



In some cases, some cards may decide to optimize things out and use fixed or halfs when they see it will save performance and have no noticeable quality loss. In ARB shaders you can give a precision hint to use higher/lower precision for each shader.

Looking at older ati chips (http://developer.amd.com/media/gpu_assets/ATI_OpenGL_Programming_and_Optimization_Guide.pdf), the floats are calculated in 24 bit numbers in the fragment shaders. How do I find out, if that is such a card?



Best,

Andreas

I don't think you can, without having a video card database saying the specifics and limitations of everything… In most cases it shouldn't matter.

Hi,

is there a way to ask, how many instructions are allowed at the fragment shader?



Best,

Andreas

Apparently jME prints out this information if logging level is set to FINEST, but doesn't seem like there's a method to access it from within the program.

I tried this in my simpleSetup()



IntBuffer oBuffer=IntBuffer.allocate(4);
ARBFragmentProgram.glGetProgramARB(ARBFragmentProgram.GL_FRAGMENT_PROGRAM_ARB, ARBFragmentProgram.GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, oBuffer);
System.out.println(oBuffer.get(0));



and got "2147483647". I 'm not sure, if I'm correct with that...

How do I set the logging level on finest in jme 2.0?

it uses the default java logger:

      Logger.getLogger("com.jme").setLevel(Level.FINEST);
      Logger.getLogger("com.jmex").setLevel(Level.FINEST);


Thx. But with that, I did not get more informations than before.