Hi.
Above demo code
I found weird shader type like FragmentInput, inout, czm_modelMaterial, which doesn’t exist in standard GLSL.
Is shader of CesiumJS compatible with threeJs’s GLSL and webGL’s GLSL?
Hi.
Above demo code
I found weird shader type like FragmentInput, inout, czm_modelMaterial, which doesn’t exist in standard GLSL.
Is shader of CesiumJS compatible with threeJs’s GLSL and webGL’s GLSL?
In some ways, no.
Cesium has its own shader structs, methods and constants, and many automatic uniforms.
The shader code itself is written in GLSL. So you can use all the built-in functionality of GLSL in your vertex- or fragment shader.
Using “pure” GLSL in WebGL can be a bit cumbersome. Even simple things require a lot of effort and care. That’s why libraries usually introduce structures for simplifying the use of custom shaders.
You mentioned three.js. You can have a look at an example of how they set up the shader for a ShaderMaterial
in one of the examples: You have to say, for example, that the object has vertex colors so that you can use the color in the shader. Similarly, values like the modelViewMatrix
will automatically be filled with sensible values. If you wanted to do that with plain WebGL, you’d have to use low-level functions like gl.getUniformLocation
and gl.uniformMatrix4fv
just to set this single matrix! Or for short: three.js is doing a lot of work for you behind the scenes!
Similarly, the CustomShader
of CesiumJS is simplifying the setup for you, so that you can focus on the “core” part that should be customized. And this part is exactly the implementation of the vertexMain
or fragmentMain
function: CesiumJS is setting up all the attributes and uniforms that are required, and collects them in the VertexInput
and FragmentInput
structures. These structures are passed to the vertexMain
/fragmentMain
functions, where you can use them to implement custom behavior.
The following is overly simplified, but it can roughly be imagined like that:
// Many attributes that are part of the model:
attribute float position;
attribute float color;
attribute float texCoord;
...
// Many uniforms that are part of the rendering setup
...
void main() {
// Collect all attributes in the VertexInput
VertexInput vertexInput;
vertexInput.attributes.positionMC = position;
vertexInput.attributes.color = color;
vertexInput.attributes.texCoord = texCoord;
// Pass the attributes to your main function:
vertexMain(vertexInput, ...)
}
//============================================================================
// You only have to write this part:
void vertexMain(VertexInput vsInput, inout czm_modelVertexOutput vsOutput)
{
float customFactor = 12.34;
vsOutput.positionMC = vsInput.attributes.positionMC * customFactor;
}
All the work that is required for setting up the attributes and uniforms with low-level WebGL calls is done by CesiumJS. You can focus on the part below the ====
line in the example.
Further documentation, for example, for the VertexInput
structure, can be found in the CustomShaderGuide
Thanks a lot @Marco13. All you explained was exactly what I wanted. Thanks to you, I got a clue!