We closed this forum 18 June 2010. It has served us well since 2005 as the ALPHA forum did before it from 2002 to 2005. New discussions are ongoing at the new URL http://forum.processing.org. You'll need to sign up and get a new user account. We're sorry about that inconvenience, but we think it's better in the long run. The content on this forum will remain online.
Page Index Toggle Pages: 1
glgraphics glsl (Read 1179 times)
glgraphics glsl
Feb 20th, 2010, 8:53am
 
How can one go about setting a vec(varying? uniform?) such as a color or mouse position and feed it into a glsl shader used within the glgGraphics addon. I found it works with John's glsl class but nothing about the functionality within the glgGraphics library (which is slightly less intimidating for an OPENGL newb such as myself)

The purpose is to attempt some simple things like painting with glsl perhaps even implementing a modified quadtree.
Re: glgraphics glsl
Reply #1 - Feb 20th, 2010, 12:50pm
 
For anyone that is interested here is John's glsl class which can interact with vec's in a glsl shader. In this example it sets the vec4 color of a quad set to the screen. Is getTextureByteBuffer function as fast (the same?) as the glgraphics lib?

This seems like a good place to start for those who want to learn some glsl coding and have access to all the possible variables.


Code:
import javax.media.opengl.GL;
import javax.media.opengl.glu.GLU;
import com.sun.opengl.util.BufferUtil;
import java.nio.*;
import processing.opengl.PGraphicsOpenGL;

GLSL glsl;
PGraphicsOpenGL pgl;
GL gl;
GLU glu = new GLU();

int texture;
PImage img;


void setup(){
 
 size(640, 480, OPENGL);

 glsl=new GLSL();
 glsl.loadFragmentShader("data/Paint.glsl");
 glsl.useShaders();
 
 img = createImage(width, height, ARGB);
 
 pgl = (PGraphicsOpenGL) g;
 gl = pgl.gl;
 gl.glShadeModel(GL.GL_SMOOTH);            
 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);  
}


 void draw(){
   
 pgl.beginGL();
 glsl.startShader();
 glsl.setUniformValue4f(glsl.getUniformLocation("Color"), 0.0,1.0,1.0,1.0);
 gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, img.width, img.height, 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, getTextureByteBuffer( false ));
 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
 gl.glBegin(GL.GL_QUADS);
 gl.glNormal3f(0.0f,0.0f,1.0f);
 gl.glTexCoord2f(0, 0); gl.glVertex2f(0, height);
 gl.glTexCoord2f(1, 0); gl.glVertex2f(width,height);
 gl.glTexCoord2f(1, 1); gl.glVertex2f(width, 0);
 gl.glTexCoord2f(0, 1); gl.glVertex2f(0, 0);
 gl.glEnd();  
 glsl.endShader();
 pgl.endGL();
}


ByteBuffer getTextureByteBuffer ( boolean useAlphaChannel )
{
 int bytesPerPixel = useAlphaChannel ? 4 : 3;
 ByteBuffer unpackedPixels = BufferUtil.newByteBuffer( img.pixels.length * bytesPerPixel );
   for (int row = img.height - 1; row >= 0; row--) {
     for (int col = 0; col < img.width; col++) {
int packedPixel = img.pixels[row * img.width + col];
unpackedPixels.put((byte) ((packedPixel >> 16) & 0xFF));
unpackedPixels.put((byte) ((packedPixel >> 8) & 0xFF));
unpackedPixels.put((byte) ((packedPixel >> 0) & 0xFF));
if ( useAlphaChannel ) {
 unpackedPixels.put((byte) ((packedPixel >> 24) & 0xFF));
       }
     }
   }
   unpackedPixels.flip();
   return unpackedPixels;
}




GLSL Class by John
Code:
class GLSL
{
 int programObject;
 GL gl;
 boolean vertexShaderEnabled;
 boolean vertexShaderSupported;  
 int vs;
 int fs;
 
 GLSL()
 {
   gl=((PGraphicsOpenGL)g).gl;
   String extensions = gl.glGetString(GL.GL_EXTENSIONS);
   vertexShaderSupported = extensions.indexOf("GL_ARB_vertex_shader") != -1;
   vertexShaderEnabled = true;    
   programObject = gl.glCreateProgramObjectARB();  
   vs=-1;
   fs=-1;
 }
 
 void loadVertexShader(String file)
 {
   String shaderSource=join(loadStrings(file),"\n");
   vs = gl.glCreateShaderObjectARB(GL.GL_VERTEX_SHADER_ARB);
   gl.glShaderSourceARB(vs, 1, new String[]{shaderSource},(int[]) null, 0);
   gl.glCompileShaderARB(vs);
   checkLogInfo(gl, vs);
   gl.glAttachObjectARB(programObject, vs);  
 }

 void loadFragmentShader(String file)
 {
   String shaderSource=join(loadStrings(file),"\n");
   fs = gl.glCreateShaderObjectARB(GL.GL_FRAGMENT_SHADER_ARB);
   gl.glShaderSourceARB(fs, 1, new String[]{shaderSource},(int[]) null, 0);
   gl.glCompileShaderARB(fs);
   checkLogInfo(gl, fs);
   gl.glAttachObjectARB(programObject, fs);  
 }

 int getAttribLocation(String name)
 {
   return(gl.glGetAttribLocationARB(programObject,name));
 }
 
 int getUniformLocation(String name)
 {
int uniformLocation = gl.glGetUniformLocationARB(programObject,name);
// println(uniformLocation);
   return(uniformLocation);
 }

void setUniformValue2f(int uniformLocation, float v0, float v1) {
gl.glUniform2f(uniformLocation, v0, v1);
}

       void setUniformValue4f(int uniformLocation, float v0, float v1, float v2, float v3) {
gl.glUniform4f(uniformLocation, v0,v1,v2,v3);
}
   
 void useShaders()
 {
   gl.glLinkProgramARB(programObject);
   gl.glValidateProgramARB(programObject);
   checkLogInfo(gl, programObject);
 }
 
 void startShader()
 {
   gl.glUseProgramObjectARB(programObject);  
 }
 
 void endShader()
 {
   gl.glUseProgramObjectARB(0);  
 }
 
 void checkLogInfo(GL gl, int obj) {

   IntBuffer iVal = BufferUtil.newIntBuffer(1);
   gl.glGetObjectParameterivARB(obj, GL.GL_OBJECT_INFO_LOG_LENGTH_ARB, iVal);

   int length = iVal.get();

   if (length <= 1) {
return;
   }

   ByteBuffer infoLog = BufferUtil.newByteBuffer(length);
   iVal.flip();
   gl.glGetInfoLogARB(obj, length, iVal, infoLog);
   byte[] infoBytes = new byte[length];
   infoLog.get(infoBytes);
   println("GLSL Validation >> " + new String(infoBytes));
 }  
}


GLSL Frag Shader

Code:
uniform vec4 Color;

void main()
{
gl_FragColor = Color;
}




Page Index Toggle Pages: 1