Here is a simple example from opengl superbible

> https://github.com/openglsuperbible/sb6code/blob/master/src/singlepoint/singlepoint.cpp

A direct translation without gles utility verbs is (beware
line wrapping)

require 'gles'

coclass 'singlepoint'
coinsert 'jgles'

fix_version=: 3 : 0
GLSL=. wglGLSL''
('#version 430 core';'#version ',(":GLSL),((GLSL>:300)#(*GLES_VERSION){::' 
core';' es')) stringreplace y
)

create=: init
destroy=: codestroy

form_close=: 3 : 0
shutdown''
wd 'pclose'
destroy''
)

form_g_initialize=: startup
form_g_paint=: render

FORM=: 0 : 0
pc form;
minwh 300 300;cc g opengl flush;
)

forminit=: 3 : 0
wd FORM
wd 'pn ', title
wd 'pshow'
)

NB. =========================================================

program=: 0
vao=: ,0

init=: 3 : 0
title=: 'OpenGL SuperBible - Single Point'
forminit''
)

vs_source=: 0 : 0
#version 430 core

void main(void)
{
    gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
}
)

fs_source=: 0 : 0
#version 430 core

out vec4 color;

void main(void)
{
    color = vec4(0.0, 0.8, 1.0, 1.0);
}
)

startup=: 3 : 0
vs_source=: fix_version vs_source
fs_source=: fix_version fs_source

program=: glCreateProgram''
fs=. glCreateShader GL_FRAGMENT_SHADER
glShaderSource fs; 1; (,symdat <'fs_source'); <<0
glCompileShader fs

vs=. glCreateShader GL_VERTEX_SHADER
glShaderSource vs; 1; (,symdat <'vs_source'); <<0
glCompileShader vs

glAttachShader program; vs
glAttachShader program; fs

glLinkProgram program

glGenVertexArrays 1; vao
glBindVertexArray {.vao
)

render=: 3 : 0
red=. 1.0 0.0 0.0 1.0
glClearBufferfv GL_COLOR; 0; red

glUseProgram program

glPointSize 40.0

glDrawArrays GL_POINTS; 0; 1
)

shutdown=: 3 : 0
glDeleteVertexArrays 1; vao
glDeleteProgram program
)

''conew'singlepoint'

Пт, 26 июн 2015, Raul Miller написал(а):
> https://www.opengl.org/discussion_boards/showthread.php/164054-Frag-shader-without-vertex-shader
> seems to confirm that vertex shaders are supposed to be optional.
> 
> But I have added a vertex shader, and that did not help.
> 
> Also, I moved glUseProgram into the paint event - and that made no
> difference. (It should not make a difference, though, as the
> underlying system is basically a state machine - once something gets
> set to a value it should retain that value until something else
> changes it. Still, when trying to isolate a problem, every assumption
> remains suspect.)
> 
> require 'graphics/gl2 api/gles'
> coinsert 'jgl2 jgles'
> 
> FORM=: 0 : 0
>  pc form closeok;
>  minwh 320 240; cc gl opengl flush;
> )
> vshader=: 0 :0
>   #version 120
>   void main(void) {
>     gl_Position=ftransform();
>   }
> )
> fshader=: 0 :0
>   #version 120
>   void main(void) {
>     gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
>   }
> )
> form_run=: 3 : 0
>   wd FORM
>   wd 'pshow'
> )
> form_gl_initialize=: 3 : 0
>   smoutput 'initializing'
>   smoutput wglGLSL''
>   'err program'=: gl_makeprogram vshader;fshader
>   if.#err do.
>     smoutput 'fail'
>     smoutput err return. end.
> )
> form_gl_paint=: 3 : 0
>   smoutput 'painting'
>   glUseProgram program
> )
> form_run''
> 
> Session still gets:
> initializing
> 450
> painting
> 
> painting
> 
> And, the rendered image is still black.
> 
> Thanks,
> 
> -- 
> Raul
> 
> On Fri, Jun 26, 2015 at 9:54 PM, bill lam <[email protected]> wrote:
> > Also can you confirm vertex (rather than fragment) shader is optional?
> >  On Jun 27, 2015 8:56 AM, "Raul Miller" <[email protected]> wrote:
> >
> >> That's an interesting clue. Thank you.
> >>
> >> But I'm still not understanding something important. For example, this
> >> still renders black:
> >>
> >> require 'graphics/gl2 api/gles'
> >> coinsert 'jgl2 jgles'
> >>
> >> FORM=: 0 : 0
> >>  pc form closeok;
> >>  minwh 320 240; cc gl opengl flush;
> >> )
> >> fshader=: 0 :0
> >>   #version 110
> >>   void main(void) {
> >>     gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
> >>   }
> >> )
> >> form_run=: 3 : 0
> >>   wd FORM
> >>   wd 'pshow'
> >> )
> >> form_gl_initialize=: 3 : 0
> >>   smoutput 'initializing'
> >>   smoutput wglGLSL''
> >>   'err program'=: gl_makeprogram '';fshader
> >>   if.#err do.
> >>     smoutput 'fail'
> >>     smoutput err return. end.
> >>   glUseProgram program
> >> )
> >> form_gl_paint=: 3 : 0
> >>   smoutput 'painting'
> >> )
> >> form_run''
> >>
> >> The output I get is:
> >>
> >> initializing
> >> 450
> >> painting
> >>
> >> painting
> >>
> >> (I also am wondering where that blank line is coming from...)
> >>
> >> Thanks,
> >>
> >> --
> >> Raul
> >>
> >> On Fri, Jun 26, 2015 at 8:44 PM, bill lam <[email protected]> wrote:
> >> > you run opengl functions in form_run but opengl context has not yet
> >> > available at that point. try put them inside the initialize callback. see
> >> > the shader.ijs demo.
> >> >
> >> > you can query the version of shader langauge in the initialize callback
> >> and
> >> > determine whether you need the #version header.
> >> > On Jun 27, 2015 8:28 AM, "Raul Miller" <[email protected]> wrote:
> >> >
> >> >> I am trying to implement a minimal example of using a shader within J.
> >> >>
> >> >> This means: no vertex shader. I just want to paint the screen a solid
> >> >> color.
> >> >>
> >> >> This means: no #version header (which I believe is equivalent to
> >> #version
> >> >> 110).
> >> >>
> >> >> Unfortunately, while this should work in principle, a number of
> >> >> variations on the implementation have not worked for me.
> >> >>
> >> >> I can show that opengl is working, using the glClear mechanism, but
> >> >> while that accomplishes the "set the screen to a single color"
> >> >> subtask, it does not get me my minimal shader which was the point of
> >> >> the exercise.
> >> >>
> >> >> Here's an example:
> >> >>
> >> >> load 'pacman'
> >> >> 'install' jpkg 'graphics/gl2 api/gles'
> >> >> require 'graphics/gl2 api/gles'
> >> >> coinsert 'jgl2 jgles'
> >> >>
> >> >> FORM=: 0 : 0
> >> >>  pc form closeok;
> >> >>  minwh 320 240; cc gl opengl flush;
> >> >> )
> >> >> fshader=: 0 :0
> >> >>   void main(void) {
> >> >>     gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
> >> >>   }
> >> >> )
> >> >> form_run=: 3 : 0
> >> >>   wd FORM
> >> >>   'err program'=: gl_makeprogram '';fshader
> >> >>   if.#err do. smoutput err return. end.
> >> >>   wd 'pshow'
> >> >>   gl_paint ''
> >> >> )
> >> >> form_gl_paint=: 3 : 0
> >> >>   smoutput 'painting'
> >> >>   glClearColor 0 0 1 1
> >> >>   glClear GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT
> >> >>   glUseProgram program
> >> >> )
> >> >> form_run''
> >> >>
> >> >> Now...
> >> >>
> >> >> Part of the problem is that I do not know what is happening in libjqt,
> >> >> and those entry points are not documented. But I do not necessarily
> >> >> need that, I hope, not right now anyways.
> >> >>
> >> >> Anyways, if I eliminate the glClearColor and glClear statements, the
> >> >> image is black. But if the shader were to be used, the image would be
> >> >> red.
> >> >>
> >> >> How do I make this work?
> >> >>
> >> >> Thanks,
> >> >>
> >> >> --
> >> >> Raul
> >> >> ----------------------------------------------------------------------
> >> >> For information about J forums see http://www.jsoftware.com/forums.htm
> >> >>
> >> > ----------------------------------------------------------------------
> >> > For information about J forums see http://www.jsoftware.com/forums.htm
> >> ----------------------------------------------------------------------
> >> For information about J forums see http://www.jsoftware.com/forums.htm
> >>
> > ----------------------------------------------------------------------
> > 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 --recv-keys 4434BAB3
gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to