This is getting to be long enough that it might help to use a resource
like github (either a repository or a gist) or even pastebin (rather
than email) to distribute it.

(I'm still getting going for today, and haven't actually tried this,
yet. But I'm anticipating some difficulties separating text from code
and maybe chasing down implied pieces.)

Thanks,

-- 
Raul

On Fri, Feb 28, 2020 at 8:52 AM Brian Schott <schott.br...@gmail.com> wrote:
>
> 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 <bbill....@gmail.com> 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 <schott.br...@gmail.com> wrote:
> >
> > --
> (B=)
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to