Thomas, thank you very much for the detail explanation.

Fri, 28 Feb 2020, Thomas McGuire написал(а):
> At first I thought I would have to. But after doing some searching on shaders 
> and OpenGL it turns out that if you don’t mind using the same shader, you can 
> just send multiple objects in and different model-views into the original 
> kernel (the GLSL code you are referring to).
> 
> It gets a little crazy because the cube drawing program has similar names for 
> things that are represented in different worlds so to speak. 
> 
> The kernel:
> #version 120
> #define lowp
> #define mediump
> #define highp
> 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);
> }
> 
> So the cube program in a_g_initialize does the following to associate top 
> level J variables with the GPU variables defined in GLSL:
> 
> vertexAttr=: >@{. glGetAttribLocation program;'vertex'
> assert. _1~: vertexAttr
> colorAttr=: >@{. glGetAttribLocation program;'color'
> assert. _1~: colorAttr
> mvpUni=: >@{. glGetUniformLocation program;’mvp'
> 
> 
> ‘Vertex’, ‘color’, and ‘mop’ on the right above refer to Kernel GLSL code 
> locations.
> Those are mapped into my J nouns on the left with slightly adjusted names.
> 
> Now looking at the code more closely I don’t need what I thought was 
> connecting a second object:
> NB. Second duplicate object as above
> vertexAttr1=: >@{. glGetAttribLocation program;'vertex'
> assert. _1~: vertexAttr1
> colorAttr1=: >@{. glGetAttribLocation program;'color'
> assert. _1~: colorAttr1
> 
> These are just the same pointers named differently from the original code and 
> therefore superfluous.
> 
> The big binding of data from J to the kernel space takes place next and is 
> centered around the vbo array. I see now that you have focused me on this 
> that vbo is just an array of pointers that get bound by openGL calls.
> glGenBuffers 2;vbo=: 4#_1
> glBindBuffer GL_ARRAY_BUFFER; 0{vbo
> glBufferData GL_ARRAY_BUFFER; (#vertexData); (symdat <'vertexData'); 
> GL_STATIC_DRAW
> glBindBuffer GL_ARRAY_BUFFER; 1{vbo
> glBufferData GL_ARRAY_BUFFER; (#colorData); (symdat <'colorData'); 
> GL_STATIC_DRAW
> glBindBuffer GL_ARRAY_BUFFER; 2{vbo
> glBufferData GL_ARRAY_BUFFER; (#vertexData); (symdat <'vertexData'); 
> GL_STATIC_DRAW
> glBindBuffer GL_ARRAY_BUFFER; 3{vbo
> glBufferData GL_ARRAY_BUFFER; (#colorData); (symdat <'colorData'); 
> GL_STATIC_DRAW
> glBindBuffer GL_ARRAY_BUFFER; 0
> 
> Where I just reuse the vertexData and colorData to represent a second object 
> to draw.
> 
> Now in a_g_paint:
> glUniformMatrix4fv mvpUni; 1; GL_FALSE; mvp
> 
> glBindBuffer GL_ARRAY_BUFFER; 0{vbo
> glEnableVertexAttribArray vertexAttr
> glVertexAttribPointer vertexAttr; 3; GL_FLOAT; 0; 0; 0
> 
> glBindBuffer GL_ARRAY_BUFFER; 1{vbo
> glEnableVertexAttribArray colorAttr
> glVertexAttribPointer colorAttr; 3; GL_FLOAT; 0; 0; 0
> 
> glDrawArrays GL_TRIANGLES; 0; 36
> 
> Sends the data to be drawn. That data was associated with the first 2 
> locations of vbo and point back to vertexData and colorData.
> 
> If I repeat the same code with a different mvp matrix to translate the cube 
> to the left on the x axis:
> NB. Draw object 2
> glUniformMatrix4fv mvpUni; 1; GL_FALSE; mvp1
> 
> glBindBuffer GL_ARRAY_BUFFER; 2{vbo
> glEnableVertexAttribArray vertexAttr
> glVertexAttribPointer vertexAttr; 3; GL_FLOAT; 0; 0; 0
> 
> glBindBuffer GL_ARRAY_BUFFER; 3{vbo
> glEnableVertexAttribArray colorAttr
> glVertexAttribPointer colorAttr; 3; GL_FLOAT; 0; 0; 0
> 
> glDrawArrays GL_TRIANGLES; 0; 36
> 
> I get 2 duplicate color shaded cubes going through their rotations together. 
> All I had to do was use different vbo buffer locations and a new map variable 
> (mvp1).
> 
> I assume the calls send that down to the kernel shader code variables vertex, 
> color, map and openGL takes care of the rest.
> 
> Tom McGuire
> 
> 
> 
> 
> > On Feb 28, 2020, at 2:42 AM, bill lam <bbill....@gmail.com> wrote:
> > 
> > Kernel means the program running inside GPU, which is
> > the c source stored inside nouns vsrc and fsrc. 
> > 
> > Fri, 28 Feb 2020, Thomas McGuire написал(а):
> >> Not sure I know what you mean but I’m using 807 on a MacBook Pro with just 
> >> the full Jqt install.
> >> 
> >>> On Feb 27, 2020, at 9:28 PM, bill lam <bbill....@gmail.com> wrote:
> >>> 
> >>> Did kernels need any modification?
> >>> 
> >>> Thu, 27 Feb 2020, Thomas McGuire написал(а):
> >>>> It took me a while to understand this a little bit. But the shader can 
> >>>> render any number of objects you just need to set up the data and tell 
> >>>> the shader to paint the object. To create 2 cubes I had to modify the 
> >>>> a_g_initialize function and the a_g_paint function. I have placed 
> >>>> comments in the code trying to show with my limited understanding of 
> >>>> OpenGL what is being done. To just create 2 duplicate cubes this code 
> >>>> could be simplified.  But if 2 different  types of objects needed to be 
> >>>> rendered everything would likely stay the same with a second set of 
> >>>> vertex and color data being added for the new object (right now I reuse 
> >>>> vertexData and colorData).
> >>>> 
> >>>> 
> >>>> 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.
> >>>> 
> >>>> NB. original cube data and the model-view-projection matrix
> >>>> vertexAttr=: >@{. glGetAttribLocation program;'vertex'
> >>>> assert. _1~: vertexAttr
> >>>> colorAttr=: >@{. glGetAttribLocation program;'color'
> >>>> assert. _1~: colorAttr
> >>>> mvpUni=: >@{. glGetUniformLocation program;'mvp'
> >>>> assert. _1~: mvpUni
> >>>> 
> >>>> NB. Second duplicate object as above
> >>>> vertexAttr1=: >@{. glGetAttribLocation program;'vertex'
> >>>> assert. _1~: vertexAttr1
> >>>> colorAttr1=: >@{. glGetAttribLocation program;'color'
> >>>> assert. _1~: colorAttr1
> >>>> 
> >>>> NB. Here is where my shape is defined. this provides the hooks
> >>>> NB. between J data and openGL
> >>>> NB. Here I increase the buffer vbo to 4 locations and reuse the
> >>>> NB. object vertexData and colorData that make the colorful cube
> >>>> glGenBuffers 2;vbo=: 4#_1
> >>>> glBindBuffer GL_ARRAY_BUFFER; 0{vbo
> >>>> glBufferData GL_ARRAY_BUFFER; (#vertexData); (symdat <'vertexData'); 
> >>>> GL_STATIC_DRAW
> >>>> glBindBuffer GL_ARRAY_BUFFER; 1{vbo
> >>>> glBufferData GL_ARRAY_BUFFER; (#colorData); (symdat <'colorData'); 
> >>>> GL_STATIC_DRAW
> >>>> glBindBuffer GL_ARRAY_BUFFER; 2{vbo
> >>>> glBufferData GL_ARRAY_BUFFER; (#vertexData); (symdat <'vertexData'); 
> >>>> GL_STATIC_DRAW
> >>>> glBindBuffer GL_ARRAY_BUFFER; 3{vbo
> >>>> glBufferData GL_ARRAY_BUFFER; (#colorData); (symdat <'colorData'); 
> >>>> GL_STATIC_DRAW
> >>>> glBindBuffer GL_ARRAY_BUFFER; 0
> >>>> 
> >>>> sprog=: program
> >>>> 
> >>>> glClearColor 0; 0; 1; 0
> >>>> )
> >>>> 
> >>>> 
> >>>> a_g_paint=: 3 : 0
> >>>> if. 0=sprog do. return. end.
> >>>> 
> >>>> wh=. gl_qwh''
> >>>> glClearColor 0 0 0 0
> >>>> 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
> >>>> NB. I created a new model: mvp1 so it will translate the cube
> >>>> NB. so there will be 2 cubes side by side
> >>>> 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.6 0 
> >>>> _8) mp glu_LookAt EYE,LR,UD,IO,UP
> >>>> mvp1=: (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 _1.2 0 
> >>>> _8) mp glu_LookAt EYE,LR,UD,IO,UP
> >>>> 
> >>>> NB. projection
> >>>> mvp=: mvp mp gl_Perspective 30, (%/wh),1 10
> >>>> mvp1=: mvp1 mp gl_Perspective 30, (%/wh),1 10
> >>>> 
> >>>> NB. note GL_FALSE, no transpose
> >>>> NB. Draw Object 1
> >>>> glUniformMatrix4fv mvpUni; 1; GL_FALSE; mvp
> >>>> 
> >>>> glBindBuffer GL_ARRAY_BUFFER; 0{vbo
> >>>> glEnableVertexAttribArray vertexAttr
> >>>> glVertexAttribPointer vertexAttr; 3; GL_FLOAT; 0; 0; 0
> >>>> 
> >>>> glBindBuffer GL_ARRAY_BUFFER; 1{vbo
> >>>> glEnableVertexAttribArray colorAttr
> >>>> glVertexAttribPointer colorAttr; 3; GL_FLOAT; 0; 0; 0
> >>>> 
> >>>> glDrawArrays GL_TRIANGLES; 0; 36
> >>>> 
> >>>> NB. Draw object 2
> >>>> glUniformMatrix4fv mvpUni; 1; GL_FALSE; mvp1
> >>>> 
> >>>> glBindBuffer GL_ARRAY_BUFFER; 2{vbo
> >>>> glEnableVertexAttribArray vertexAttr1
> >>>> glVertexAttribPointer vertexAttr1; 3; GL_FLOAT; 0; 0; 0
> >>>> 
> >>>> glBindBuffer GL_ARRAY_BUFFER; 3{vbo
> >>>> glEnableVertexAttribArray colorAttr1
> >>>> glVertexAttribPointer colorAttr1; 3; GL_FLOAT; 0; 0; 0
> >>>> 
> >>>> glDrawArrays GL_TRIANGLES; 0; 36
> >>>> 
> >>>> NB. Objects drawn perform glDisableVertexAttribArray
> >>>> NB. what ever that is for
> >>>> glBindBuffer GL_ARRAY_BUFFER; 0
> >>>> glDisableVertexAttribArray colorAttr
> >>>> glDisableVertexAttribArray vertexAttr
> >>>> glDisableVertexAttribArray colorAttr1
> >>>> glDisableVertexAttribArray vertexAttr1
> >>>> 
> >>>> glDisable GL_DEPTH_TEST
> >>>> glDisable GL_CULL_FACE
> >>>> 
> >>>> glUseProgram 0
> >>>> 
> >>>> gl_clear ''
> >>>> gl_rgb 0 255 0
> >>>> gl_textcolor ''
> >>>> gl_textxy 10 30
> >>>> gl_text 'keys: x y z a s l r F10'
> >>>> 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.
> >>>> )
> >>>> 
> >>>> 
> >>>>> On Feb 14, 2020, at 4:14 PM, Brian Schott <schott.br...@gmail.com> 
> >>>>> wrote:
> >>>>> 
> >>>>> Bill,
> >>>>> 
> >>>>> Thank you very much.
> >>>>> 
> >>>>> Mostly I want to get n turtles, not cubes, that are not rotating to time
> >>>>> but behave like "Logo" turtles and react to commands in the Terminal 
> >>>>> window
> >>>>> like Forward 3 and Right 90. So I want to start with 2 separate turtles 
> >>>>> and
> >>>>> I guess I am all wrong in my idea that the long mvp commands are moving 
> >>>>> the
> >>>>> eye, but moving the cube/turtle. So my next experiment will be to copy 
> >>>>> and
> >>>>> edit the code beginning at the following line of code.
> >>>>> 
> >>>>> glGenBuffers 2;vbo=: 2#_1
> >>>>> 
> >>>>> So for example to make another cube/turtle I'm thinking that that line
> >>>>> could be changed so that _2 replaces the _1. Does that make any sense?
> >>>>> 
> >>>>> *****************below I react to your code 
> >>>>> revisions***********************
> >>>>> I had to change your f8 and f9 to f6 and f7 because on my Mac f8 is
> >>>>> clipboard and f9 is run project.
> >>>>> Now, at least when I put an smoutput into a_f6_fkey and a_f7_fkey I see
> >>>>> they are being executed, but I do not see the cube, (and this happens
> >>>>> without changing the focus to the Terminal window, which is needed 
> >>>>> below).
> >>>>> After intially loading and running the shader.ijs script in the project
> >>>>> window, I get a blank "a" window and each time I press F10 I get a new
> >>>>> fresh, blank "a" window. But if I click on the Terminal window and then
> >>>>> click on the "a" window and THEN press F10, I get the moving cube.
> >>>>> Subsequent F6 and F7 presses produce the smoutput results in the 
> >>>>> Terminal
> >>>>> window but BLANK the active "a" window.
> >>>>> *****************above I react to your code 
> >>>>> revisions***********************
> >>>>> 
> >>>>> But the previous paragraph is mostly a distraction except that you code
> >>>>> revision shows me a little about how the "handle" is important for 
> >>>>> finding
> >>>>> the parent from the child and vice versa. And about repainting.
> >>>>> 
> >>>>> I am mostly interested in how commands in the Terminal window can be 
> >>>>> sent
> >>>>> to the Cube in the "a" window. Any pointers?
> >>>>> 
> >>>>> 
> >>>>> On Fri, Feb 14, 2020 at 1:58 AM bill lam <bbill....@gmail.com> wrote:
> >>>>> 
> >>>>>> I tried to incoporate your change into shader.ijs
> >>>>>> with f8/f9 to change value for gl_translate.
> >>>>>> The changes lines are marked by NB. <<<<<
> >>>>>> pressing f8/f9 can trigger repaint and the matrix
> >>>>>> display also updated, but I can't see the cube at all.
> >>>>>> Pressing F10 to start original code, the cube came back.
> >>>>>> I did not pursue further but hope this is enough to
> >>>>>> answer your question about how to repaint.
> >>>>>> 
> >>>>>> 
> >>>>> ----------------------------------------------------------------------
> >>>>> For information about J forums see http://www.jsoftware.com/forums.htm
> >>>> 
> >>>> ----------------------------------------------------------------------
> >>>> For information about J forums see http://www.jsoftware.com/forums.htm
> >>> 
> >>> -- 
> >>> regards,
> >>> ====================================================
> >>> GPG key 1024D/4434BAB3 2008-08-24
> >>> gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
> >>> ----------------------------------------------------------------------
> >>> For information about J forums see http://www.jsoftware.com/forums.htm
> >> 
> >> ----------------------------------------------------------------------
> >> For information about J forums see http://www.jsoftware.com/forums.htm
> > 
> > -- 
> > regards,
> > ====================================================
> > GPG key 1024D/4434BAB3 2008-08-24
> > gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> 
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm

-- 
regards,
====================================================
GPG key 1024D/4434BAB3 2008-08-24
gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to