mirror of
https://github.com/Open-Cascade-SAS/OCCT.git
synced 2026-05-12 11:06:26 +08:00
Port of commit 1e1584357 adapted to the new source layout and modern NCollection_Mat3/NCollection_Mat4 types. - Graphic3d_ShaderVariable: register NCollection_Mat3<float> and NCollection_Mat4<float> type IDs; add template instantiations and Graphic3d_UniformMat3/Graphic3d_UniformMat4 typedefs. - Graphic3d_ShaderProgram: add PushVariableMat3() and PushVariableMat4() convenience methods. - OpenGl_ShaderProgram: add single-value SetUniform() for mat3 (wrapping glUniformMatrix3fv); register mat3/mat4 in OpenGl_VariableSetterSelector so custom uniforms are dispatched. - ViewerTest (vshader command): add -vec2, -vec3, -vec4, -mat3, -mat4 argument parsing for setting custom uniform variables from Draw Harness. - Add Draw Harness test exercising the new uniform types.
66 lines
1.9 KiB
Plaintext
66 lines
1.9 KiB
Plaintext
puts "========"
|
|
puts "Test custom uniform variables: -vec2, -vec3, -vec4, -mat3, -mat4"
|
|
puts "========"
|
|
|
|
pload MODELING VISUALIZATION
|
|
|
|
# draw a box
|
|
box b 1 2 3
|
|
vclear
|
|
vclose ALL
|
|
vinit View1
|
|
vsetdispmode 1
|
|
vaxo
|
|
vdisplay b
|
|
vfit
|
|
vrotate 0.2 0.0 0.0
|
|
|
|
set aGlslVer "#version 110"
|
|
if { [vdriver -default] == "TKOpenGles" } { set aGlslVer "#version 300 es" }
|
|
|
|
# vertex shader applying a mat4 uniform transform and passing a vec4 color to fragment
|
|
set aShaderVert "
|
|
uniform mat4 uModelTrsf;
|
|
uniform mat3 uNormTrsf;
|
|
uniform vec4 uColor;
|
|
uniform vec3 uLightDir;
|
|
uniform vec2 uScale;
|
|
THE_SHADER_OUT vec4 vColor;
|
|
THE_SHADER_OUT vec3 vNormal;
|
|
void main() {
|
|
vec4 aPos = uModelTrsf * occVertex;
|
|
aPos.xy *= uScale;
|
|
vNormal = normalize(uNormTrsf * occNormal.xyz);
|
|
vColor = uColor;
|
|
gl_Position = occProjectionMatrix * occWorldViewMatrix * aPos;
|
|
}"
|
|
|
|
# fragment shader using the passed color and simple diffuse lighting
|
|
set aShaderFrag "
|
|
uniform vec3 uLightDir;
|
|
THE_SHADER_IN vec4 vColor;
|
|
THE_SHADER_IN vec3 vNormal;
|
|
void main() {
|
|
float aNdotL = max(dot(normalize(vNormal), normalize(uLightDir)), 0.2);
|
|
occSetFragColor(vec4(vColor.rgb * aNdotL, vColor.a));
|
|
}"
|
|
|
|
# identity mat4 (row-major: 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1)
|
|
# identity mat3 (row-major: 1 0 0 0 1 0 0 0 1)
|
|
vshaderprog b -vert $aShaderVert -frag $aShaderFrag -header "$aGlslVer" \
|
|
-mat4 uModelTrsf 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 \
|
|
-mat3 uNormTrsf 1 0 0 0 1 0 0 0 1 \
|
|
-vec4 uColor 0.2 0.6 1.0 1.0 \
|
|
-vec3 uLightDir 0.0 0.0 1.0 \
|
|
-vec2 uScale 1.0 1.0
|
|
vdump $::imagedir/${::casename}_identity.png
|
|
|
|
# apply a non-identity mat4 (translation by 0.5 in X)
|
|
vshaderprog b -vert $aShaderVert -frag $aShaderFrag -header "$aGlslVer" \
|
|
-mat4 uModelTrsf 1 0 0 0.5 0 1 0 0 0 0 1 0 0 0 0 1 \
|
|
-mat3 uNormTrsf 1 0 0 0 1 0 0 0 1 \
|
|
-vec4 uColor 1.0 0.4 0.2 1.0 \
|
|
-vec3 uLightDir 1.0 1.0 1.0 \
|
|
-vec2 uScale 0.8 0.8
|
|
vdump $::imagedir/${::casename}_translated.png
|