2017-12-07 19 views
0

Emscripten의 현재 릴리스에서 glDrawElements()가 작동해야합니까? (v1.37.1) 내가 무엇을하던간에 glDrawElements()를 호출하면 오류 1282가 발생하고 물론 브라우저에는 아무 것도 렌더링되지 않습니다.glDrawElements는 Emscripten의 현재 릴리스에서 작동하고 있습니까? (v1.37.1)

중요 : WebGL 용으로 작성된 셰이더를 사용하는 경우에도 PC 용 VS로 컴파일 한 후 프로그램이 완벽하게 실행됩니다. 모든 것이 예상대로 작동하며 오류가 발생하지 않습니다. 그러나 웹에 오류 1282.

메인 루프 : 난 단지뿐만 아니라 쿼드를 렌더링하기 위해 노력하고있어

glClear(GL_COLOR_BUFFER_BIT); 

glBindVertexArray(VaoId); 

glGetError(); // Clear any previous errors 
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 
int error = glGetError(); if (error != 0) printf("Error: %i\n", error); 

glBindVertexArray(0); 

glfwPollEvents(); 
glfwSwapBuffers(m_Instance); 

하는 VAO 1 VBO, 인덱스 및 위치 모두 하나 VBO에 저장된다. VertexAttribPointers가 올바르게 설정되었습니다. 셰이더는 오류없이 웹 브라우저 용으로 컴파일됩니다. 글자 그대로 glGetError()는 glDrawElements() 호출 바로 뒤에 오류 코드를 생성합니다.

emscripten 버그 또는 WebGL 버그입니까?

[EDIT]

컴파일하여 :

EM ++ -std = C++ 11 -s USE_GLFW = 3 -s FULL_ES3 = 1 = 1 -s ALLOW_MEMORY_GROWTH --emrun MAIN.CPP -o t .html

+0

더 자세한 WebGL 오류 정보를 얻을 수있는 방법이 있습니다. (필자는) Firefox Nightly를 사용하고 emscripten에서 디버그 모드로 컴파일한다면, 그럴 수도있다. WebGL 2, GLES 3.0 및 Open GL 3.x에는 미묘한 차이점이 있으므로 WebGL 또는 emscripten의 버그가 아니라 사용자의 오류 일 가능성이 있습니다.하지만 추가 오류 메시지가이를 추적하는 데 도움이됩니다. – MuertoExcobito

답변

0

emscripten 버그 또는 WebGL 버그입니까?

아마도 코드에 버그가있을 수 있습니다.

NVIDIA의 드라이버가 AMD의 드라이버보다 더 용서가 깊어서 후자가 심하게 거부 할 코드를 실행하게합니다. 비슷한 일이 일어날 수 있습니다. 코드가 네이티브 응용 프로그램처럼 잘 작동하지만 브라우저 환경에서는 버그가 중요한 문제가됩니다. 예를 들어 Chrome에서 ANGLE을 사용하여 OpenGL을 Direct3D (Windows에서)로 구현하면 네이티브 그래픽 드라이버와 약간의 차이가 발생할 수 있습니다. 물론 이것은 단지 추측이지만 그럼에도 불구하고 glDrawElements과 같은 필수 기능이 손상되지는 않을 것입니다.

오류 코드 1282가 glDrawElements 인 경우 "0이 아닌 버퍼 객체 이름이 활성화 된 배열 또는 요소 배열에 바인딩되고 버퍼 객체의 데이터 저장소가 현재 매핑되어있는 경우 생성됩니다 [이 경우 가장 가능성이 높습니다] "(source).

또는 쉐이더가 오류의 원인 일 수 있습니다.이 경우 소스를 Google에 공유 한 경우 유용합니다. 합니다 (glDrawElements에 문제가 될 수있는 사람들을위한

+0

안녕하세요, 저는 광범위한 디버깅 세션을 수행했으며 오류나 경고없이 PC에서 쉽게 작동하는 여러 가지가 내 코드에서 발생했지만 웹에서 같은 방식으로 작동하지는 않습니다. 오후의 연구가 끝나자 나는 이러한 오류의 약 90 %를 수정하고 webgl의 기대에 맞게 코드를 수정했습니다. 나는 아직도 약간의 오류와 경고를 받고 있지만 마침내 나의 3D 세계는 적어도 그려져있다. :) – oglglslnoob

+0

듣기 좋게 :). 그 10 %와 행운을 빈다. – Lignum

0

) 웹에서 특별히 전화 :

내 문제는 내가 모든 vertext 속성과 1 개 버퍼에 인덱스를 저장했다는 사실로 밝혀졌다. 이것은 PC에서 잘 작동하지만 웹에서라면 개의 별도의 버퍼 - 1은 인덱스를, 다른 하나는 모든 위치/uvs/법선을 위해 만듭니다. 그런 다음 "vertexAttributePointers"를 적절히 설정하십시오. vbo. 브라우저에서는 배열에 버퍼를 바인드 할 수 없으며 OpenGL에서 PC에서 수행 할 수있는 다른 버퍼에도 바인드 할 수 없으므로 오류/경고없이 작동합니다.

초기화시 VBO와 IBO를 모두 VAO에 바인드해야합니다. 그런 다음 VAO를 리 바인드하고, VAO를 바인드 해제하고, 렌더링 된 다음 오브젝트 - 작업을 수행하십시오.