2013-07-13 3 views
1

3 GLEventListener를 구현 한 다음 SceneRenderer 클래스가 있습니다. 내가 버퍼를 만들고 버퍼에 포인터를 저장하고 데이터로 버퍼를 채우는 과정을 이해할 수 있다고 생각한다.JOGL/OpenGL VBO - 버텍스를 렌더링하는 방법은 무엇입니까?

나는 투쟁이 display() 방법입니다. 나는 인터넷에서 발견 된 모든 것들의 거의 모든 조합을 시도해 봤지만 나는 아직도 그릴 수 없다. 누군가 버퍼링 된 데이터로 가득 채워져 지금 무엇을해야하는지 설명해 주시겠습니까?

1. 쉐이더
쉐이더 GPU에서 실행되는 프로그램은 다음과 같습니다

package cz.pscheidl.gui; 

import javax.media.opengl.*; 
import javax.media.opengl.glu.GLU; 
import java.nio.FloatBuffer; 
import java.nio.IntBuffer; 


public class SceneRenderer implements GLEventListener { 

private IntBuffer buffers = IntBuffer.allocate(2); 
private float[] square = { 
     -1.0f, -1.0f, 
     1.0f, -1.0f, 
     1.0f, 1.0f, 
     1.0f, 1.0f, 
     -1.0f, 1.0f, 
     -1.0f, -1.0f, 
}; 

private float[] colorData = { 
     255, 0, 0, 
     255, 255, 0, 
     0, 255, 0, 
     0, 255, 0, 
     0, 0, 255, 
     255, 0, 0 
}; 

FloatBuffer vertexFB = FloatBuffer.wrap(square); 
FloatBuffer colorFB = FloatBuffer.wrap(colorData); 


GLU glu = new GLU(); 

@Override 
public void init(GLAutoDrawable glAutoDrawable) { 
    GL3 gl = glAutoDrawable.getGL().getGL3(); 

    gl.glEnableClientState(GL2.GL_VERTEX_ARRAY); 


    gl.glEnable(GL2.GL_DEPTH_TEST); 
    gl.glClearDepthf(10.0f); 
    gl.glClearColor(0.8f, 0.6f, 0.8f, 1.0f); 
    gl.glDepthFunc(GL2.GL_LEQUAL); 

    gl.glGenBuffers(2, buffers); 

    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(0)); 
    gl.glBufferData(GL2.GL_ARRAY_BUFFER, 4 * 6 * 2, vertexFB, GL3.GL_STATIC_DRAW); 


    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(1)); 
    gl.glBufferData(GL2.GL_ARRAY_BUFFER, 4 * 6 * 3, colorFB, GL2.GL_STREAM_DRAW); 

} 

@Override 
public void dispose(GLAutoDrawable glAutoDrawable) { 
} 

@Override 
public void display(GLAutoDrawable glAutoDrawable) { 
    GL3 gl = glAutoDrawable.getGL().getGL3(); 
    gl.glClear(GL3.GL_DEPTH_BUFFER_BIT | GL3.GL_COLOR_BUFFER_BIT); 


    gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, buffers.get(0)); 
    //After binding the buffer, now WHAT ? 

} 

@Override 
public void reshape(GLAutoDrawable glAutoDrawable, int i, int i2, int i3, int i4) { 
    GL3 gl = glAutoDrawable.getGL().getGL3(); 
    glu.gluPerspective(80.0f, 1920.0f/1080.0f, 0.1f, 100f); 

} 
} 
+1

다음과 같은 몇 가지 일반적인 설명이 필요하다고 생각합니다. 바인딩은 다음 번에 그릴 때 사용할 객체를 OpenGL에 알려주고 OpenGL에 실제로 그려야한다고 말한 다음 OpenGL에서 드로잉을 완료하고 프레임을 표시 할 때까지 기다려야합니다. 화면에. 바인딩이 덮여있다면 http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml을 사용하여 그릴 수 있으며 마무리 방법을 보려면 몇 가지 기본 JOGL 자습서를 찾아야합니다. 라는 swapBuffers 또는 뭔가) 프레임을 그리기. –

답변

7

당신이없는 몇 가지가있다. 이것은 gpu에게 데이터를 어떻게 처리할지 알려주는 방법입니다. 이것은 Vertex와 Fragment Shader가있는 매우 기본적인 프로그램을 만드는 방법입니다. 클래스 수준의 VAR 선언과

넣어 이것을 :

private int program; 

이 (당신의 초기화 내부에 갈 것) 기능 :

// Create program. 
program = gl.glCreateProgram(); 

// Create vertexShader. 
int vertexShader = gl.glCreateShader(GL2ES2.GL_VERTEX_SHADER); 
String[] vertexShaderSource = new String[1]; 
vertexShaderSource[0] = "#version 330\n" + 
    "layout(location=0) in vec2 position;\n" + 
    "layout(location=1) in vec3 color;\n" + 
    "out vec3 vColor;\n" + 
    "void main(void)\n" + 
    "{\n" + 
    "gl_Position = vec4(position, 0.0, 1.0);\n" 
    "vColor = vec4(color, 1.0);\n" 
    "}\n"; 
gl.glShaderSource(vertexShader, 1, vertexShaderSource, null); 
gl.glCompileShader(vertexShader); 

// Create and fragment shader. 
int fragmentShader = gl.glCreateShader(GL2ES2.GL_FRAGMENT_SHADER); 
String[] fragmentShaderSource = new String[1]; 
fragmentShaderSource[0] = "#version 330\n" + 
    "in vec4 vColor;\n" + 
    "out vec4 fColor;\n" + 
    "void main(void)\n" + 
    "{\n" + 
    "fColor = vColor;\n" + 
    "}\n"; 
gl.glShaderSource(fragmentShader, 1, fragmentShaderSource, null); 
gl.glCompileShader(fragmentShader); 

// Attach shaders to program. 
gl.glAttachShader(program, vertexShader); 
gl.glAttachShader(program, fragmentShader); 
gl.glLinkProgram(program); 


2. 정점 배열 당신은이
그릴 때 사용할 필요가있는 두 개의 버퍼. Vertex Array를 사용하면 여러 버퍼의 상태를 저장하고 셰이더 프로그램의 다른 위치로 데이터를 보낼 수 있습니다.

클래스 수준의 VAR 선언에 이것을 넣어 :

IntBuffer vertexArray = IntBuffer.allocate(1); 

이를 또한 초기화() 함수에 갈 것입니다, 당신은 버퍼를 만든 후 : (

// Create Vertex Array. 
gl.glGenVertexArrays(1, vertexArray); 
gl.glBindVertexArray(vertexArray.get(0)); 

// Specify how data should be sent to the Program. 

// VertexAttribArray 0 corresponds with location 0 in the vertex shader. 
gl.glEnableVertexAttribArray(0); 
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(0)); 
gl.glVertexAttribPointer(0, 2, GL.GL_FLOAT, false, 0, 0); 

// VertexAttribArray 1 corresponds with location 1 in the vertex shader. 
gl.glEnableVertexAttribArray(1); 
gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, buffers.get(1)); 
gl.glVertexAttribPointer(1, 3, GL.GL_FLOAT, false, 0, 0); 

디스플레이를) 함수를 이제 다음과 같이 보일 것입니다 :

@Override 
public void display(GLAutoDrawable glAutoDrawable) { 
    GL3 gl = glAutoDrawable.getGL().getGL3(); 
    gl.glClear(GL3.GL_DEPTH_BUFFER_BIT | GL3.GL_COLOR_BUFFER_BIT); 

    gl.glUseProgram(program) 
    gl.glBindVertexArray(vertexArray.get(0)); 
    gl.glDrawArrays(GL.GL_TRIANGLES, 0, 6) 
} 

기타 참고 사항 :
- 색상 값의 범위는 0에서 255가 아니라 0에서 1까지입니다.
- 프로그램이 닫히거나 더 이상 필요하지 않을 때를 대비하여 생성 한 OpenGL 개체를 조사해야합니다.
- OpenGL BookLearning Modern 3D Graphics Programming과 같은 자습서를 읽어 보는 것이 좋습니다. 코드 예제는 C++로되어 있지만 매우 유용한 것으로 나타났습니다.

+0

그 사이에 VAO와 VBO 사이의 "연구"와 관계가 명확하지 않았습니다. 귀하의 게시물은 내 하루를 보냈습니다. 고맙습니다. –

관련 문제