ARGENTO CUORE

 May the code be with you.

--.--.--[--] スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2010.02.24[水] JOGLでシェーダープログラミング・その2

JOGLでシェーダープログラミングしようーと思う前段階で詰まり中。
Teapotを表示させてみたけれども、全然シェーダーいじっても表示が変わらない。
アーマーナイト以下の速度で前進しますorz

import javax.swing.*;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLJPanel;
import javax.media.opengl.glu.GLU;
import java.io.*;
import java.nio.IntBuffer;
import java.nio.ByteBuffer;
import com.sun.opengl.util.gl2.GLUT;
import com.sun.opengl.util.FPSAnimator;

public class Sample02 extends JFrame implements GLEventListener{
GLU glu;

GLCapabilities caps = new GLCapabilities(null);
GLJPanel panel = new GLJPanel();

GLUT glut = new GLUT();

int vertex_shader;
int fragment_shader;
int shader_program;

float[] lightpos = {0.0f,0.0f,5.0f,1.0f};
float[] lightcol = {1.0f,1.0f,1.0f,1.0f};
float[] lightamb = {0.1f,0.1f,0.1f,1.0f};

FPSAnimator anim;
int counter = 0;
public Sample02(){
panel.addGLEventListener(this);
setSize(200,200);
setContentPane(panel);
}

public static void main(String[] args){
Sample02 s = new Sample02();
s.setLocationRelativeTo(null);
s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
s.setVisible(true);
}

public void init(GLAutoDrawable drawable){
GL2 gl = drawable.getGL().getGL2();
glu = new GLU();

gl.glClearColor(0.0f,0.0f,0.0f,0.0f);

gl.glShadeModel(GL2.GL_SMOOTH);
gl.glEnable(GL2.GL_DEPTH_TEST);
gl.glDisable(GL2.GL_CULL_FACE);

gl.glEnable(GL2.GL_LIGHTING);
gl.glEnable(GL2.GL_LIGHT0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, lightcol,0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, lightcol,0);
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, lightamb,0);
gl.glLightModeli(GL2.GL_LIGHT_MODEL_LOCAL_VIEWER, GL2.GL_TRUE);
anim = new FPSAnimator(panel,20,true);
anim.start();

vertex_shader = gl.glCreateShader(GL2.GL_VERTEX_SHADER);
fragment_shader = gl.glCreateShader(GL2.GL_FRAGMENT_SHADER);

String[] vertex_source = readShaderSource("vertex_shader.glsl");
int[] vertex_length = new int[1];
vertex_length[0] = vertex_source[0].length();

//各行の終端がNULLである場合はlengthにnullを渡す。
//そうでない場合は、各行の文字列数を入れたint型の配列を渡す。
gl.glShaderSource(vertex_shader,1,vertex_source,vertex_length,0);
gl.glCompileShader(vertex_shader);

String[] fragment_source = readShaderSource("fragment_shader.glsl");
gl.glShaderSource(fragment_shader, 1, fragment_source, (int[])null,0);
gl.glCompileShader(fragment_shader);

shader_program = gl.glCreateProgram();
gl.glAttachShader(shader_program, vertex_shader);
gl.glAttachShader(shader_program, fragment_shader);
gl.glLinkProgram(shader_program);
gl.glValidateProgram(shader_program);

gl.glUseProgram(shader_program);
}

private String[] readShaderSource(String filename){
String[] src = new String[1];
src[0] = "";
String line;
try{
BufferedReader br = new BufferedReader(new FileReader(filename));
while((line=br.readLine()) != null){
src[0] += line + "\n";
}
}catch(IOException e){}
return src;
}

public void display(GLAutoDrawable drawable){
GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
glu.gluLookAt(0.0, 0.0, 5.0, 0.0,0.0,0.0, 0.0,1.0,0.0);

float[] diffuse = {0.8f,0.8f,0.8f,1.0f};
float[] specular = {0.3f,0.3f,0.3f,1.0f};
gl.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_AMBIENT_AND_DIFFUSE, diffuse,0);
gl.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_SPECULAR, specular,0);
gl.glMaterialf(GL2.GL_FRONT_AND_BACK, GL2.GL_SHININESS, 100.0f);

gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightpos, 0);

gl.glPushMatrix();
gl.glRotatef(counter,0f,1f,0f);
glut.glutSolidTeapot(2.0);
gl.glPopMatrix();
gl.glFlush();

if (counter >= 360){
counter = 0;
}else{
counter++;
}
}

public void dispose(GLAutoDrawable drawable){

}

public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h){
GL2 gl = drawable.getGL().getGL2();
gl.glViewport(0,0,w,h);
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(75.0,(double)w/(double)h,1.0,20.0);
}
}


実行結果
jogl02.png


スポンサーサイト

Comment






(編集・削除用)


管理者にだけ表示を許可

Trackback

http://ronor.blog81.fc2.com/tb.php/47-e34fb338

この記事にトラックバック(FC2Blog User)

Scala Feed

scala feed

FC2カウンター

プロフィール

RoNor

Author:RoNor
得意呪文はScalaですって言えるようになるのが夢です。
デスマーチ中、パーティメンバーの防御力を向上させたりさせなかったり。

検索フォーム

QRコード

QRコード

Copyright © 2009-2010 ARGENTO CUORE and RoNor All rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。