2010-01-27 2 views
0

OpenGL 라인 스트립을 사용하여 동시에 화면에 많은 선을 그려야하고 성능이 느리며 버텍스 버퍼를 사용하는 것이 좋습니다. 나는 꼭지점 버퍼를 처음 사용합니다. 그리려는 각 라인마다 새로운 버퍼가 필요합니까, 아니면 모든 라인에 단일 버퍼를 사용해야합니까 (반드시 서로 연결되어 있지는 않습니다)? 이 시점에서 나는 각 라인이 정점의리스트 인 선 목록을 가지고 있지만, 이것을 빨리 렌더링하는 방법을 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다.버텍스 버퍼가있는 Java OpenGL 선 그리기

EDIT : 예외를 제공하는 현재 코드는 다음과 같습니다. EDIT2 : glVertexPointer를 호출하기 전에 버퍼를 되감으므로 버퍼가 전진하기 때문에 예외가 수정되었습니다. 이 문제가 해결되었습니다.

java.lang.IndexOutOfBoundsException: Required 1 remaining elements in buffer, only had0 
at com.sun.gluegen.runtime.BufferFactory.rangeCheck(BufferFactory.java:247) 
at com.sun.opengl.impl.GLImpl.glVertexPointer(GLImpl.java:27937) 

    for (int i = 0; i < lines.size(); i++) 
    { 
     List<Vertex> v = lines.get(i); 
     DoubleBuffer buf = BufferUtil.newDoubleBuffer(v.size() * 3); 

     Iterator<Vertex> iter = v.iterator(); 
     while (iter.hasNext()) 
     { 
      Vertex vt = iter.next(); 
      buf.put(new double[] { vt.x, vt.y, vt.z }); 
     } 
     gl.glVertexPointer(3, GL.GL_DOUBLE, 0, buf); 
     gl.glEnableClientState(GL.GL_VERTEX_ARRAY); 
     gl.glDrawArrays(GL.GL_LINES, 0, v.size()); 
     gl.glDisableClientState(GL.GL_VERTEX_ARRAY); 
    } 

는 희망이 내 문제에 더 좋은 통찰력을 (내가 여기 불구하고 배우려고 노력하고,이 코드는 문제가 알) 제공합니다. 함께 제공

덕분에, 제프

답변

0

나는 또한 OpenGL은 초보자 및 자바 바인딩에 익숙하지 않은,하지만 난 더 나은 답변을 할 때까지 정확한 방향을 가리 키도록 노력하겠습니다.

내가 아는 한, 정점 버퍼는 하나뿐입니다. 클라이언트 측 데이터를 사용하여 정점 버퍼에 직접 렌더링 할 수 있습니다. 그렇게하고 싶다면 glEnableClientState (GL_VERTEX_ARRAY), glBindBuffer, glVertexPointer, glDrawElements와 같은 호출을 살펴보십시오. 또한 인덱스 배열에 쓸 필요가 있습니다.

opengl 사이트에 따르면 이러한 호출은 이제 버텍스 버퍼 객체를 사용하여 더 이상 사용되지 않습니다. 나는 그들에 대해 많이 알지 못하지만, 귀하의 질문에 따라 이것은 사람들이 당신을 위해 제안한 것입니다. 그들은 꽤 잘 여기 샘플 코드와 함께 설명되어 있습니다

성능 문제에 관해서는

http://www.opengl.org/wiki/Vertex_Buffer_Objects

, 당신이 바로 선 스트립에서 문제를 얻는 것이라고 이상한 것 같다. 또한 비디오 카드에 적합한 OpenGL 드라이버가 있는지 확인하거나 Java 대신 C++와 같은 모국어를 사용할 것인지 확인합니다.

+0

아니요, "단 하나의"꼭지점 버퍼가 없습니다. 당신은 원하는만큼 가질 수 있습니다. VBO에 "렌더링"하지 않으면 glBufferData 및/또는 glBufferSubData로 채 웁니다. vbo에서 glBindBuffer + glVertexPointer로 오프셋하여 데이터에 _refer_하고 실제로 연속 Draw의 데이터를 사용합니다. VBO는 정점 버퍼입니다. – Bahbar

0

꼭지점 버퍼는 단지 GL에 의해 할당되고 관리되는 메모리입니다. 따라서, 그들은 Draws에 직접적으로 관련이 없습니다.

이제 GL에 정점 데이터를 직접 저장하면 데이터가 많이 변경되지 않으면 성능이 향상 될 수 있습니다 (프레임마다 데이터를 전송하지 않아도 됨).

귀하의 질문은 매우 정량적이지는 않습니다. "천천히"라는 것이 정확히 무엇을 의미합니까? 몇 줄을 그리시겠습니까? 현재 얼마나 많은 드로우 콜을하고 있습니까? 어떤 종류의 공연을합니까? 어떤 종류의 선을 그립니까?

각각 별도의 그리기 호출이 필요하기 때문에 많은 선을 빨리 그리기 어렵습니다. GL_LINES를 사용하면 동일한 그리기에서 여러 줄을 일괄 처리 할 수 ​​있습니다. 그리고 그것은 훨씬 더 잘 수행되어야합니다. 나는 자바 GL과 그 익숙하지 난 ... 난 당신의 코드를보고,

좋아하지만 VertexPointer에 buf를 통과하지 않는다는 점에서 그 코드가 의심스러운 :

편집 추가 할 수 있습니다. 그것은 v? put도 의심스러운 것으로 보입니다. 두배를 두 번 누르지 않고 배열입니까?

+0

모호함을 드려 죄송합니다. 위의 편집에서와 같이 GL_LINES를 사용하려고 노력하고 있지만 제대로 작동하지 않는 것 같습니다. –

+0

네, 맞습니다. 그 타입 -o이었다. 이제 코드가 작동합니다. 저는 NASA WorldWind에서 사용하고 있지만, 렌더링은 여전히 ​​매우 느립니다. 이것이 WorldWind 또는 OpenGL과 관련이 있는지 확실하지 않습니다 ... –