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