Open ghost opened 5 years ago
Compiled the following program.
makeFrame (time :: Float) (vertexstream :: PrimitiveStream Triangle ((Vec 4 Float))) = imageFrame (emptyDepthImage 1, emptyColorImage navy) `overlay` fragments where projmat = perspective 0.1 100.0 (30 * pi / 180) 1.0 .*. lookat (V3 3.0 1.3 0.3) (V3 0.0 0.0 0.0) (V3 0.0 1.0 0.0) .*. rotMatrixY (pi / 24.0 * time) .*. translateBefore4 (V3 0.5 0.5 0.5) fragments = vertexstream & mapPrimitives (\((x)) -> (scale 0.5 (projmat *. x), x)) & rasterizePrimitives (TriangleCtx CullNone (PolygonLine 1.0) NoOffset LastVertex) ((Smooth)) & accumulateWith (DepthOp Less True, ColorOp NoBlending (V4 True True True True)) cube = map (\v -> V4 v%x v%y v%z 1) [ V3 0 0 0, V3 1 0 0, V3 0 1 0 , V3 0 1 0, V3 1 1 0, V3 1 0 0 , V3 0 0 0, V3 0 0 1, V3 0 1 1 , V3 0 0 0, V3 0 1 0, V3 0 1 1 , V3 1 0 0, V3 1 0 1, V3 1 1 1 , V3 1 0 0, V3 1 1 0, V3 1 1 1 , V3 0 0 0, V3 0 0 1, V3 1 0 0 , V3 0 0 1, V3 1 0 1, V3 1 0 0 , V3 0 1 0, V3 0 1 1, V3 1 1 0 , V3 0 1 1, V3 1 1 1, V3 1 1 0 , V3 0 0 1, V3 1 0 1, V3 0 1 1 , V3 0 1 1, V3 1 1 1, V3 1 0 1 ] cubeStream = fetchArrays @Triangle ((cube)) main = renderFrame $ makeFrame (Uniform "time") cubeStream
The generated vertex shader
#version 330 core vec4 texture2D(sampler2D s,vec2 uv) { return texture(s,uv); } uniform float time; in vec4 vi1; smooth out vec4 vo1; vec4 ext0_Float_3(vec3 z0) { return vec4 ((z0).x,(z0).y,(z0).z,0.0); } vec3 neg_VecSFloat3(vec3 z0) { return - (z0); } mat4 lookat(vec3 z0,vec3 z1,vec3 z2) { return (transpose (mat4 (ext0_Float_3 (normalize (cross (z2 ,normalize ((z0) - (z1))))) ,ext0_Float_3 (cross (normalize ((z0) - (z1)) ,normalize (cross (z2,normalize ((z0) - (z1)))))) ,ext0_Float_3 (normalize ((z0) - (z1))) ,vec4 (0.0,0.0,0.0,1.0)))) * (translateBefore4 (neg_VecSFloat3 (z0))); } mat4 perspective(float z0,float z1,float z2,float z3) { return mat4 (vec4 (((2.0) * (z0)) / (((z3) * ((z0) * (tan ((z2) / (2.0))))) - ((0.0) - ((z3) * ((z0) * (tan ((z2) / (2.0))))))) ,0.0 ,0.0 ,0.0) ,vec4 (0.0 ,((2.0) * (z0)) / (((z0) * (tan ((z2) / (2.0)))) - ((0.0) - ((z0) * (tan ((z2) / (2.0)))))) ,0.0 ,0.0) ,vec4 ((((z3) * ((z0) * (tan ((z2) / (2.0))))) + ((0.0) - ((z3) * ((z0) * (tan ((z2) / (2.0))))))) / (((z3) * ((z0) * (tan ((z2) / (2.0))))) - ((0.0) - ((z3) * ((z0) * (tan ((z2) / (2.0))))))) ,(((z0) * (tan ((z2) / (2.0)))) + ((0.0) - ((z0) * (tan ((z2) / (2.0)))))) / (((z0) * (tan ((z2) / (2.0)))) - ((0.0) - ((z0) * (tan ((z2) / (2.0)))))) ,(0.0) - (((z1) + (z0)) / ((z1) - (z0))) ,-1.0) ,vec4 (0.0,0.0,(0.0) - ((((2.0) * (z1)) * (z0)) / ((z1) - (z0))),0.0)); } mat4 rotMatrixY(float z0) { return mat4 (vec4 (cos (z0),0.0,(0.0) - (sin (z0)),0.0) ,vec4 (0.0,1.0,0.0,0.0) ,vec4 (sin (z0),0.0,cos (z0),0.0) ,vec4 (0.0,0.0,0.0,1.0)); } vec4 scale(float z0,vec4 z1) { return (z1) * (vec4 (z0,z0,z0,1.0)); } mat4 translateBefore4(vec3 z0) { return mat4 (vec4 (1.0,0.0,0.0,0.0) ,vec4 (0.0,1.0,0.0,0.0) ,vec4 (0.0,0.0,1.0,0.0) ,vec4 ((z0).x,(z0).y,(z0).z,1.0)); } void main() { gl_Position = scale (0.5 ,((((perspective (0.1,100.0,0.5235987755982988,1.0)) * (lookat (vec3 (3.0 ,1.3 ,0.3) ,vec3 (0.0,0.0,0.0) ,vec3 (0.0,1.0,0.0)))) * (rotMatrixY ((0.1308996938995747) * (time)))) * (translateBefore4 (vec3 (0.5 ,0.5 ,0.5)))) * (vi1)); vo1 = vi1; }
Manually placing translateBefore4 before lookat in the generated vertex shader resolves the issue.
translateBefore4
lookat
It seems that CoreToIR's fixFuncs function does not calculate the dependency graph correctly. Instead of a custom implementation it would be better to use Data.Graph.topSort.
Compiled the following program.
The generated vertex shader
Manually placing
translateBefore4
beforelookat
in the generated vertex shader resolves the issue.