Re: [android-developers] Creating OpenGL shaders from an alternate class

2012-11-08 Thread Harri Smått
Hi,

If you're still tackling with this problem here's an example of class that I've 
used successfully for compiling and using GLSL shader programs;

https://github.com/harism/android_effects/blob/master/src/fi/harism/effects/EffectsShader.java

Compile method (setProgram) throws an exception with 
GLES20.glGetProgramInfoLog(int) content if there's a problem with the shader 
source.

--
H

-- 
You received this message because you are subscribed to the Google
Groups Android Developers group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en


[android-developers] Creating OpenGL shaders from an alternate class

2012-11-01 Thread Braindrool
Title pretty much says it all. This would be so much easier if I were to 
just use a single class for this. But I have been trying to take advantage 
of Java's class system. To the point I get the Error creating shader.

package com.braindrool.game;


 import android.opengl.GLES20;


 public class Shader {


 public Shader(String vertexShader, String fragmentShader) {

 int vertexShaderHandle = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);

 if (vertexShaderHandle != 0) {

 GLES20.glShaderSource(vertexShaderHandle, vertexShader);

 GLES20.glCompileShader(vertexShaderHandle);

 final int[] vertexCompileStatus = new int[1];

 GLES20.glGetShaderiv(vertexShaderHandle, GLES20.GL_COMPILE_STATUS,

 vertexCompileStatus, 0);

 if (vertexCompileStatus[0] == 0) {

 GLES20.glDeleteShader(vertexShaderHandle);

 System.err.println(Deleting vertex shader);

 vertexShaderHandle = 0;

 }

 }

 if (vertexShaderHandle == 0) {

 }

 int fragmentShaderHandle = GLES20

 .glCreateShader(GLES20.GL_FRAGMENT_SHADER);


 if (fragmentShaderHandle != 0) {

 System.out.println(Fragmentshaderhandle success);

 GLES20.glShaderSource(fragmentShaderHandle, fragmentShader);

 GLES20.glCompileShader(fragmentShaderHandle);

 final int[] fragmentCompileStatus = new int[1];

 GLES20.glGetShaderiv(fragmentShaderHandle,

 GLES20.GL_COMPILE_STATUS, fragmentCompileStatus, 0);

 if (fragmentCompileStatus[0] == 0) {

 GLES20.glDeleteShader(fragmentShaderHandle);

 fragmentShaderHandle = 0;

 }

 }


 if (fragmentShaderHandle == 0) {

 System.err.println(Error creating fragment shader.);

 }


 System.out

 .println(linkShaders(vertexShaderHandle, fragmentShaderHandle));

 }


 private int linkShaders(int vertexHandle, int fragmentHandle) {

 int programHandle = GLES20.glCreateProgram();


 if (programHandle != 0) {

 GLES20.glAttachShader(programHandle, vertexHandle);

 GLES20.glAttachShader(programHandle, fragmentHandle);

 GLES20.glBindAttribLocation(programHandle, 0, a_Position);

 GLES20.glBindAttribLocation(programHandle, 1, a_Color);

 GLES20.glLinkProgram(programHandle);

 final int[] linkStatus = new int[1];

 GLES20.glGetProgramiv(programHandle, GLES20.GL_LINK_STATUS,

 linkStatus, 0);

 if (linkStatus[0] == 0) {

 GLES20.glDeleteProgram(programHandle);

 programHandle = 0;

 }

 }


 if (programHandle == 0) {

 System.err.println(Error creating program.);

 }

 return programHandle;

 }

 }



And the call to that function / class:

private void finishLoading() {


 mGLView.queueEvent(new Runnable() {

 public void run() {

 shader = new Shader(asset(shaders/vertex/default),

 asset(shaders/fragment/default));

 }

 });



Questions and help greatly appreciated! 
 

-- 
You received this message because you are subscribed to the Google
Groups Android Developers group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en