Bill, especially (Thomas, Raul, and others), Your comment regarding trying a simpler figure and simplifying the color has led me to consider several alternatives. Below I show a revised script which uses a tetrahedron (4 faces) and some color changes. I think the tetrahedron is mostly working for me but I am really confused about the colors.
I apologize for the length of this email, but I have many questions. As an aside, I have discovered an error in the shader.ijs in the qtdemo's. The last 0 in the following line should be a 1 because it's the alpha value. (Coincidentally, there is another line in shader.ijs which also addresses ClearColor, but it is ignored, I think, and it separates the integers with ;'s .) Correcting that alpha value creates a black background, which can be effective. glClearColor 0 0 0 0 Btw, I have left 2 glClearColor's in the script so it's easy to swap them: white 1 1 1 1 and black 0 0 0 1 . The major changes I have made to the script are the following. NB. changed cube to a mirrored sphenoid(?) NB. (eg, see https://en.wikipedia.org/wiki/Architectonic_and_catoptric_tessellation) rt=: (|.@:{)`[`]} NB. rotates vertices of xth face for winding order vertexData=: 1&fc ,1 rt 3 rt 4 3 3$ %&10, 0&". ;._2 [ 0 : 0 _3 _9 _4 3 _9 _4 0 0 2 0 8 _4 ) I discovered that the verb `rt` (or something like it) is required to make the tetrahedron work because of face winding issues. The original cube was adjusted another way, apparently. With `vertexData` defined either as above OR without `1&fc` prepended I get the SAME --mostly desirable-- results. The inclusion and exclusion of `1&fc` giving the same result is confusing, by itself, and begs the question, "Why is `1&fc` used?" I said "mostly desirable" above, instead of "desirable" because of the next 2 issues. v0) The 10 in the first line of the definition of vertexData is used to simplify data entry and I have also used it to experiment with scaling the size of the tetrahedron. This has led to another surprise, that no scaling seems to result from increasing the 10 to 80 or so. Why? v1) I have been disillusioned by the face coloring of the tetrahedron, even in the simplest situations because when the tetrahedron is rotated in certain directions, the black or white background seems to bleed through one of the edges. What causes that? Now, moving on to coloring. I have no idea how the face COLORing works using almost any version of `colorData` below. I can generalize though on one thing: if I leave out the `1&fc`, no colors work on ANY version of `colorData` . The first version below seems to give a complete tetrahedron except for the background color bleeding through one edge. And as mentioned earlier, it only works with vertices rotated with the rt verb. colorData=: 1&fc ,1 rt 3 rt 4 3 3$ , 0&". ;._2 [ 0 : 0 0 0 1 1 1 1 1 0 0 0 1 0 ) f0) If the 1's in the second row are changed to 0.9's, the background color no longer bleeds in. Why? f1) (This approach does not seem to work at all, and I have a replacement for it that works a little, but will send it in a new message) I want 2 of the faces in the tetrahedron to have the same color and each of the other 2 to have a different color (3 colors altogether). I devised the following NONWORKING scheme of colors to accomplish this result. By nonworking I mean only the background color shows in the graphics pane, no tetrahedron. Why? colorData=: 1&fc ,_3]\3#"2] 0&". ;._2 [ 0 : 0 0 0 1 1 1 1 1 0 0 0 1 0 ) To demonstrate the result above consider the following result which makes each of the 4 faces, represented by the boxes' contents below, has 3 identical rows. ;/_3]\3#"2] 0&". ;._2 [ 0 : 0 0 0 1 1 1 1 1 0 0 0 1 0 ) +-----+-----+-----+-----+ |0 0 1|1 1 1|1 0 0|0 1 0| |0 0 1|1 1 1|1 0 0|0 1 0| |0 0 1|1 1 1|1 0 0|0 1 0| +-----+-----+-----+-----+ ***************my revised slider.ijs script is below************ cocurrent 'demoshader' mp=: (+/ . *)"2 rt=: (|.@:{)`[`]}NB. rotates vertices of xth face for winding order sprog=: 0 GLSL=: 0 STOP=: 0 A=: 0 : 0 pc a; minwh 300 300;cc g opengl flush; rem form end; ) a_run=: 3 : 0 NB. if. -. checkrequire_qtdemo_ 'gles';'api/gles' do. return. end. require 'gl2' coinsert 'jgl2' require 'gles' coinsert 'jgles' require '~addons/ide/qt/opengl.ijs' coinsert 'qtopengl' STEPS=: 100 R=: 20 30 0 EYE=: 0 0 1 LR=: UD=: IO=: 0 UP=: 0 1 0 wd A HD=: ".wd'qhwndc g' wd 'ptimer 100' wd 'pshow' ) a_g_initialize=: 3 : 0 if. p=. >@{. glGetString GL_VERSION do. smoutput 'GL_VERSION: ', memr 0 _1 2,~ p end. if. 0=p do. smoutput 'cannot retrieve GL_VERSION' return. end. if. p=. >@{. glGetString GL_VENDOR do. smoutput 'GL_VENDOR: ', memr 0 _1 2,~ p end. if. p=. >@{. glGetString GL_RENDERER do. smoutput 'GL_RENDERER: ', memr 0 _1 2,~ p end. if. p=. >@{. glGetString GL_SHADING_LANGUAGE_VERSION do. smoutput 'GL_SHADING_LANGUAGE_VERSION: ', memr 0 _1 2,~ p end. GLSL=: wglGLSL'' wglPROC'' sprog=: 0 if. GLSL>120 do. vsrc=. vsrc2 fsrc=. fsrc2 else. vsrc=. vsrc1 fsrc=. fsrc1 if. 0=GLES_VERSION_jgles_ do. vsrc=. vsrc,~ '#define lowp', LF, '#define mediump', LF, '#define highp', LF fsrc=. fsrc,~ '#define lowp', LF, '#define mediump', LF, '#define highp', LF end. end. vsrc=. '#version ',(":GLSL),((GLSL>:300)#(*GLES_VERSION){::' core';' es'),LF,vsrc fsrc=. '#version ',(":GLSL),((GLSL>:300)#(*GLES_VERSION){::' core';' es'),LF,fsrc if.(GLSL>:300)*.0~:GLES_VERSION_jgles_ do. fsrc=. ('void main';'out vec4 gl_FragColor;',LF,'void main') stringreplace fsrc end. smoutput vsrc smoutput fsrc 'err program'=. gl_makeprogram vsrc;fsrc if. #err do. smoutput err return. end. vertexAttr=: >@{. glGetAttribLocation program;'vertex' assert. _1~: vertexAttr colorAttr=: >@{. glGetAttribLocation program;'color' assert. _1~: colorAttr mvpUni=: >@{. glGetUniformLocation program;'mvp' assert. _1~: mvpUni glGenBuffers 2;vbo=: 2#_1 glBindBuffer GL_ARRAY_BUFFER; {.vbo glBufferData GL_ARRAY_BUFFER; (#vertexData); (symdat <'vertexData'); GL_STATIC_DRAW glBindBuffer GL_ARRAY_BUFFER; {:vbo glBufferData GL_ARRAY_BUFFER; (#colorData); (symdat <'colorData'); GL_STATIC_DRAW glBindBuffer GL_ARRAY_BUFFER; 0 sprog=: program NB. glClearColor 0; 0; 1; 1 ) a_g_char=: 3 : 0 if. 0=#sysdata do. return. end. R=: 360 | R + 2 * 'xyz' = 0 { sysdata k=. 0{sysdata STEPS=: 200 <. STEPS + 's' = k STEPS=: 3 >. STEPS - 'a' = k LR=: LR - 0.01*'l'=k LR=: LR + 0.01*'r'=k gl_paint '' ) a_timer=: 3 : 0 if. 0=STOP do. return. end. R=: 360 | R + 2 * 1 1 1 gl_sel HD gl_paint'' ) a_g_paint=: 3 : 0 if. 0=sprog do. return. end. wh=. gl_qwh'' glClearColor 1 1 1 1 glClearColor 0 0 0 1 NB. this is new glClear GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT glUseProgram sprog glEnable GL_DEPTH_TEST glEnable GL_CULL_FACE NB. matrix convention: current matrix on the left NB. note pre-multiplication NB. model-view mvp=: (gl_Rotate (0{R), 1 0 0 ) mp (gl_Rotate (1{R), 0 1 0) mp (gl_Rotate (2{R), 0 0 1) mp (gl_Scale STEPS%100) mp (gl_Translate 0 0 _8) mp glu_LookAt EYE,LR,UD,IO,UP NB. projection mvp=: mvp mp gl_Perspective 30, (%/wh),1 10 NB. note GL_FALSE, no transpose glUniformMatrix4fv mvpUni; 1; GL_FALSE; mvp glBindBuffer GL_ARRAY_BUFFER; {.vbo glEnableVertexAttribArray vertexAttr glVertexAttribPointer vertexAttr; 3; GL_FLOAT; 0; 0; 0 glBindBuffer GL_ARRAY_BUFFER; {:vbo glEnableVertexAttribArray colorAttr glVertexAttribPointer colorAttr; 3; GL_FLOAT; 0; 0; 0 glDrawArrays GL_TRIANGLES; 0; 12 NB. 36 was for cubes ******* glBindBuffer GL_ARRAY_BUFFER; 0 glDisableVertexAttribArray colorAttr glDisableVertexAttribArray vertexAttr glDisable GL_DEPTH_TEST glDisable GL_CULL_FACE glUseProgram 0 gl_clear '' gl_rgb 255 255 255 gl_textcolor '' gl_textxy 10 30 gl_text 'keys: x y z a s l r F4' gl_textxy 10 50 gl_text 'scale: ',":STEPS%100 gl_textxy 10 70 gl_text 'angle: ',":R gl_textxy 10 90 if. 0=sprog do. return. end. gl_text 'matrix:' for_i. i.4 do. gl_textxy 10, 105+i*15 gl_text 6j2": i{mvp end. ) a_f4_fkey=: 3 : 0 STOP=: -.STOP NB. gl_paint '' ) a_cancel=: a_close a_close=: 3 : 0 STOP=: 0 wd 'ptimer 0' glDeleteBuffers ::0: 2; vbo glDeleteProgram ::0: sprog wd 'pclose' ) NB. Mirrored sphenoid? vertexData=: 1&fc ,1 rt 3 rt 4 3 3$ %&80, 0&". ;._2 [ 0 : 0 _3 _9 _4 3 _9 _4 0 0 2 0 8 _4 ) colorData=: 1&fc ,1 rt 3 rt 4 3 3$ , 0&". ;._2 [ 0 : 0 0 0 1 1 1 1 1 0 0 0 1 0 ) NB. ========================================================= vsrc1=: 0 : 0 attribute highp vec3 vertex; attribute lowp vec3 color; varying lowp vec4 v_color; uniform mat4 mvp; void main(void) { gl_Position = mvp * vec4(vertex,1.0); v_color = vec4(color,1.0); } ) fsrc1=: 0 : 0 varying lowp vec4 v_color; void main(void) { gl_FragColor = v_color; } ) NB. ========================================================= vsrc2=: 0 : 0 in vec3 vertex; in vec3 color; out vec4 v_color; uniform mat4 mvp; void main(void) { gl_Position = mvp * vec4(vertex,1.0); v_color = vec4(color,1.0); } ) fsrc2=: 0 : 0 in vec4 v_color; void main(void) { gl_FragColor = v_color; } ) NB. ========================================================= a_run'' On Fri, Feb 14, 2020 at 7:19 PM bill lam <[email protected]> wrote: > If you intended to run turtle graphics only, then drawing cube is over > skilled. Drawing triangles is much simpler. eg a triangle with vertices > 0 1 0, 1 _1 0, _1 _1 0 > then use different scale, translate and rotate to place them into different > positions and orientations. > > Also only a constant solid color from fragment shader is sufficient. > > On Sat, Feb 15, 2020, 7:19 AM Brian Schott <[email protected]> wrote: > > -- (B=) ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
