2016-10-22 3 views
0

아래의 LWJGL 3 코드는 삼각형 렌더링을위한 버퍼 등을 설정합니다. 나는 삼각형을 볼 수있다. 지금 나는 정확히 무슨 일이 일어나는지 이해하려고 노력하고 있습니다.버텍스 버퍼 데이터를 배열 버텍스 데이터 흐름

아래 코드를 이해했습니다. 먼저 숫자 배열을위한 컨테이너 인 정점 버퍼 객체를 만듭니다. glBindBuffer() 및 glBufferData()는 정점 버퍼를 정점 배열로 채 웁니다. 두 번째 정점 배열에 대해이 작업을 다시 수행합니다. 그런 다음 정점 및 조각 쉐이더를 컴파일하고 쉐이더 프로그램에 추가합니다. 어떻게 든이 프로그램은 두 번째 정점 버퍼 객체의 데이터에 액세스합니다.

그러면 정점 배열 객체를 바인딩합니다. 두 번째 버텍스 버퍼 객체의 버텍스 데이터를 처리 한 쉐이더 프로그램의 결과물로 채워 넣습니다.

질문

이 설치 정점 복수의 데이터가 동일한 명령 세트에 의해 처리 될 수 있도록하는 것 같습니다. 두 번째 코드가 아닌 첫 번째 정점 데이터를 전달하기 위해 코드 끝 부분에 어떤 명령을 배치 할 것입니까? 모든 버텍스 버퍼 객체에 대해 별도의 버텍스 배열 객체를 생성해야합니까, 아니면 다른 버퍼를 파이프 아래로 보내고 동일한 버텍스 배열 객체를 유지할 수 있습니까? 여기에 코드

내가 위의 참조 된 코드입니다 : 첫째, 변수는 다음과 같습니다

//The vertices of a triangle 
float[] vertices = new float[] { 
     0.0f, 0.5f, 
     0.5f, -0.5f, 
     -0.5f, -0.5f 
}; 

//Vertices of the second triangle 
float[] vertices2 = new float[] { 
     0.0f, 0.9f, 
     0.5f, -0.5f, 
     -0.5f, -0.5f 
}; 

//The source for the vertex shader 
String vertexShaderSrc = 
     "#version 300 es\n\n" + 
     "precision mediump float;\n" + 
     "in vec2 position;\n\n" + 
     "void main()\n" + 
     "{\n" + 
      "gl_Position = vec4(position, 0.0, 1.0);\n" + 
     "}"; 

int vertexShader; 

//The source for the fragment shader 
String fragmentShaderSrc = 
     "#version 300 es\n\n" + 
     "precision mediump float;\n" + 
     "out vec4 outColor;\n\n" + 
     "void main()\n" + 
     "{\n" + 
      "outColor = vec4(1.0, 1.0, 1.0, 1.0);\n" + 
     "}"; 
int fragmentShader; 
int shaderProgram; 
//The position attribute 
int posAttrib; 

//A vertex buffer object handle. 
int vbo; 

//A second vertex buffer object handle. 
int vbo2; 

//A vertex array object handle. 
int vao; 

을 사용하는 코드 세그먼트는 다음과 같습니다

vbo = glGenBuffers(); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW); 

vbo2 = glGenBuffers(); 
glBindBuffer(GL_ARRAY_BUFFER, vbo2); 
glBufferData(GL_ARRAY_BUFFER, vertices2, GL_STATIC_DRAW); 


vertexShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertexShader, vertexShaderSrc); 
glCompileShader(vertexShader); 

System.out.println(glGetShaderInfoLog(vertexShader)); 

fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragmentShader, fragmentShaderSrc); 
glCompileShader(fragmentShader); 

System.out.println(glGetShaderInfoLog(fragmentShader)); 

shaderProgram = glCreateProgram(); 
glAttachShader(shaderProgram, vertexShader); 
glAttachShader(shaderProgram, fragmentShader); 
glBindFragDataLocation(shaderProgram, 0, "outColor"); 
glLinkProgram(shaderProgram); 
glUseProgram(shaderProgram); 

vao = glGenVertexArrays(); 
glBindVertexArray(vao); 

posAttrib = glGetAttribLocation(shaderProgram, "position"); 
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, false, 0, 0); 
glEnableVertexAttribArray(posAttrib); 

답변

0

"그것은 이 설정은 여러 개의 버텍스 데이터가 동일한 명령 세트로 처리되도록하는 것입니다. "- 예, 위젯을 전달할 수 있습니다. h 정점 위치, 텍스처 좌표, 정점 색상 등과 같은 데이터를 포함하는 정점 버퍼 오브젝트를 더 추가하여 정점 어레이 오브젝트를 호출합니다. 셰이더와 같은 위치에 전송 된 정점 데이터를 변경하려면 유니폼으로 전달 된 transformation matrix을 사용하여 개체를 이동, 크기 조절 및 회전 할 수 있습니다. 그러나 객체가 다른 모델 인 경우 다른 용도로 사용해야합니다.