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