2012-07-21 3 views
0

쉐이더와 프로그램 가능한 파이프 라인을 사용하고 있는데, 두 개의 메쉬를 선 (아마도 색깔)으로 연결해야하지만이 두 객체의 모델 행렬 만 있습니다.OpenGL 쉐이더 : 두 객체와 그것들을 연결하는 한 줄

start point: 0,0,0 
end point: 0,0,0 

내가하여 쉐이더에서 이러한 점을 곱해야합니다 가정 두 개체를 연결하는 : 내가해야 두 점의 객체 좌표를 가정 있도록 라인은 이러한 개체의 중심에서 시작한다 각각의 객체의 모델 행렬. 그리고 나서 모든 것을 뷰 매트릭스로 곱하십시오 (이것은 두 객체에 공통적입니다). 그리고 결국 투영 행렬에 의해.

저는 항상 버텍스 배열과 함께 셰이더를 사용했습니다. 두 개의 다른 버텍스를 셰이더에 어떻게 전달할 수 있습니까? 제복도 사용해야하나요? 그리고 glDrawElements와 glDrawArrays가 모두 데이터 배열을 필요로하기 때문에 라인을 그릴 때 어떤 함수를 사용해야합니까?

+1

많은 라인 (100s, 1000s)을 원한다면 포인트를 유니폼으로 보내는 것이 비효율적입니다. 또한 어떻게 그 선을 그립니까? 방법 (각 픽셀을 테스트하는 lines_strips 또는 fragement shader를 출력하는 geometry shader)이 있지만, 이것은 불필요하게 복잡합니다. – torbjoernwh

+0

좋아요, 배열을 사용해야하는 경우, 제발 그걸 어떻게 수행하는지에 대한 예제를 친절하게 제공해 주실 수 있습니까? –

+1

다음은 같은 질문입니다. 고정 된 함수 GL : http://stackoverflow.com/questions/11593053/opengl-draw-line-between-two-elements – torbjoernwh

답변

2

가장 간단한 방법은 GL_LINES로 그리려는 모든 선의 월드 포인트를 포함하는 VBO를 만드는 것입니다.

가장 쉬운 방법은 glDrawArrays를 사용하는 것입니다. 만약 (10.000s +) 사이에 선이 필요한 객체 쌍이 극단적 인 경우에는 VBO에 모든 점을 저장 한 다음 IBO (인덱스 버퍼)를 사용하여 VBO의 어떤 점이 선.

선 정점은 뷰 행렬에 의해 변형되어야합니다.

다음은 예입니다. GLuint vao, vbo;

// generate and bind the vao 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

// generate and bind the buffer object 
glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 

struct Point{ 
    float x,y,z; 
    Point(float x,float y,float z) 
        : x(x), y(y), z(z) 
    {} 
}; 

// create two points needed for a line. For more lines, just add another point-pair 
std::vector<Point> vertexData; 
vertexData.push_back(Point(-0.5, 0.f, 0.f)); 
vertexData.push_back(Point(+0.5, 0.f, 0.f)); 

// fill with data 
size_t numVerts = vertexData.size(); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Point)*numVerts, &vertexData[0], GL_STATIC_DRAW); 

// set up generic attrib pointers 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, numVerts*sizeof(Point), (char*)0 + 0*sizeof(GLfloat)); 

// "unbind" vao 
glBindVertexArray(0); 

// In your render-loop: 
glBindVertexArray(vao); 
glDrawArrays(GL_LINES, 0, numVerts); 

당신이 glBufferData을의 표준 : : 벡터를 업데이트, 런타임 동안 더 많은 포인트 쌍을 추가 VBO를 바인딩하고 호출해야합니다.

+0

감사합니다! 당신은 매우 친절했고 내 문제를 해결했습니다, 다시 한번 감사드립니다! –

관련 문제