Difference between revisions of "Shaders"

From JPCT
Jump to: navigation, search
(Created page with 'jPCT supports shaders for compiled objects')
 
Line 1: Line 1:
jPCT supports shaders for [[compiled objects]]
+
=== Shaders ===
 +
 
 +
jPCT supports shaders for [[compiled objects]]. However, there is no generic shader framework. You have to write the shader code in OpenGL by yourself and attach it to the compiled object by implemting the IRenderHook-interface. Here's an example of a simple fragment- (in DX:pixel-) shader that paints all framents in green:
 +
 
 +
<pre>
 +
import java.nio.*;
 +
import com.threed.jpct.*;
 +
import org.lwjgl.*;
 +
import org.lwjgl.opengl.*;
 +
 
 +
public class MyFirstShader implements IRenderHook {
 +
 
 +
private String myShaderSource="void main() {gl_FragColor = vec4(0.0,1.0,0.0,1.0);}";
 +
private int prg=0;
 +
private int fragShade=0;
 +
private boolean init=false;
 +
 +
public void beforeRendering(int polyID) {
 +
if (!init) {
 +
init();
 +
}
 +
ARBShaderObjects.glUseProgramObjectARB(prg);
 +
}
 +
 
 +
public void afterRendering(int polyID) {
 +
ARBShaderObjects.glUseProgramObjectARB(0);
 +
}
 +
 
 +
public void onDispose() {
 +
ARBShaderObjects.glDeleteObjectARB(fragShade);
 +
ARBShaderObjects.glDeleteObjectARB(prg);
 +
}
 +
 
 +
public boolean repeatRendering() {
 +
return false;
 +
}
 +
 +
private void init() {
 +
prg=ARBShaderObjects.glCreateProgramObjectARB();
 +
fragShade=ARBShaderObjects.glCreateShaderObjectARB(ARBFragmentShader.GL_FRAGMENT_SHADER_ARB);
 +
 +
byte[] src=myShaderSource.getBytes();
 +
ByteBuffer shader = BufferUtils.createByteBuffer(src.length);
 +
shader.put(src);
 +
shader.flip();
 +
 +
ARBShaderObjects.glShaderSourceARB(fragShade, shader);
 +
 +
ARBShaderObjects.glCompileShaderARB(fragShade);
 +
ARBShaderObjects.glAttachObjectARB(prg, fragShade);
 +
ARBShaderObjects.glLinkProgramARB(prg);
 +
 +
Logger.log("Shader compiled!", Logger.MESSAGE);
 +
 +
init=true;
 +
}
 +
}
 +
</pre>

Revision as of 20:39, 7 April 2009

Shaders

jPCT supports shaders for compiled objects. However, there is no generic shader framework. You have to write the shader code in OpenGL by yourself and attach it to the compiled object by implemting the IRenderHook-interface. Here's an example of a simple fragment- (in DX:pixel-) shader that paints all framents in green:

import java.nio.*;
import com.threed.jpct.*;
import org.lwjgl.*;
import org.lwjgl.opengl.*;

public class MyFirstShader implements IRenderHook {

	private String myShaderSource="void main() {gl_FragColor = vec4(0.0,1.0,0.0,1.0);}";
	private int prg=0;
	private int fragShade=0;
	private boolean init=false;
	
	public void beforeRendering(int polyID) {
		if (!init) {
			init();
		}
		ARBShaderObjects.glUseProgramObjectARB(prg);
	}

	public void afterRendering(int polyID) {
		ARBShaderObjects.glUseProgramObjectARB(0);
	}

	public void onDispose() {
		ARBShaderObjects.glDeleteObjectARB(fragShade);
		ARBShaderObjects.glDeleteObjectARB(prg);
	}

	public boolean repeatRendering() {
		return false;
	}
	
	private void init() {
		prg=ARBShaderObjects.glCreateProgramObjectARB();
		fragShade=ARBShaderObjects.glCreateShaderObjectARB(ARBFragmentShader.GL_FRAGMENT_SHADER_ARB);
		
		byte[] src=myShaderSource.getBytes();
		ByteBuffer shader = BufferUtils.createByteBuffer(src.length);
		shader.put(src);
		shader.flip();
		
		ARBShaderObjects.glShaderSourceARB(fragShade, shader);
		
		ARBShaderObjects.glCompileShaderARB(fragShade);
		ARBShaderObjects.glAttachObjectARB(prg, fragShade);
		ARBShaderObjects.glLinkProgramARB(prg);
		
		Logger.log("Shader compiled!", Logger.MESSAGE);
		
		init=true;
	}
}