2011-02-11 3 views
6

GLSL 1.50, openGL 3.3.변형 피드백 (OpenGL)의 전체 설정

저는 최근에 tranform 피드백을 얻으려고했지만 성공하지 못했습니다. glBeginTranformFeedback()을 수행 한 후에도 오류가 발생하며 전체 작업 코드를 찾지 못해서 필자가 발견 한 일부 코드와 설명서를 가지고 지식을 쌓아 봤지만 지금은 잘 작동하고 있지만 뭔가 빠져 있습니다. 그래서 누군가가 완전한 코드 (버퍼 초기화, 설정, 업데이트, 렌더링, 다시 읽기)를 얻으면 확실하게 도움이 될 것이고 만약에 당신이 무슨 일이 일어나고 있는지 알면 내 코드를 볼 수있을 것입니다. 나는 약간의 벤치마킹을 제외 창문의 취급과 창조의 : 단지 GLSL의 optimalization에 대한이 높이 요

#version 150 core 
in vec3 speed; 

varying vec3 sp; 

const float gravity_constant = 9.81f; 

void main(){ 
    sp = speed; 
    sp += vec3(0,-gravity_constant,0); 
} 

파편

#version 150 core 
varying vec3 sp; 

void main (void) 
{ 
    vec3 c = sp; 
    gl_FragColor = vec4(c,1.0); 
} 

조각 쉐이더 :

int main() 
{ 
    bool fullsize = false, paused = false; 
    std::string caption = "Tester"; 

    GLuint dataVAO,speedUpdateVBO,dataVBO; 
    std::vector<vector3f> dataW; 

    // Create the main rendering window 

    init(); //just some camera commands 

    UniShader shader; //my shader class keeps everything together 
    shader.init(); 
    shader.addShader("test.vert"); 
    shader.addShader("test.frag"); 
    shader.newAttributeVariable("speed"); 
    shader.newFeedbackVarying("sp"); 
    shader.linkShader(); 
    shader.use(); 

    //init some data 
    dataW.push_back(vector3f(0,1,0)); 

    //creating VAO 
    glGenVertexArrays(1,&dataVAO); 
    glBindVertexArray(dataVAO); 
    //creating VBO 
    glGenBuffers(1,&dataVBO); 
    glBindBuffer(GL_ARRAY_BUFFER,dataVBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vector3f), 0, GL_DYNAMIC_DRAW); 
    glVertexAttribPointer(shader.getAttributeIndex("speed"), 3, GL_FLOAT, GL_FALSE, 0, 0); 

    glGenBuffers(1, &speedUpdateVBO); 
    glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, speedUpdateVBO); 
    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(vector3f), NULL, GL_DYNAMIC_COPY); 
    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, speedUpdateVBO); 
    glBindVertexArray(0); 


    while (App.IsOpened()) 
    { 
      App.SetActive(); 
     benchP = Clock.GetElapsedTime(); 

     //update calls 
     if(!paused) 
      //update 
     benchU = Clock.GetElapsedTime(); 

     //render calls 
     glClearColor(1.0f, 1.0f, 1.0f, 0.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glColor3f(0.6f,0.7f,0.7f); 

    GLuint query; 
    GLuint count = 0; 

    glGenQueries(1, &query); 

    glEnableVertexAttribArray(shader.getAttributeIndex("speed")); 

    glBindVertexArray(dataVAO); 

    glBindBuffer(GL_ARRAY_BUFFER,dataVBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vector3f)*dataW.size(), &dataW[0], GL_DYNAMIC_DRAW); 
    glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, speedUpdateVBO); 
    glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(vector3f)*dataW.size(), NULL, GL_DYNAMIC_COPY); 

    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, speedUpdateVBO); 
    glEnable(GL_RASTERIZER_DISCARD); 
    glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query); 
    printOglError(); //Until this everything OK, I think 
    glBeginTransformFeedback(GL_POINTS); 
    printOglError(); //This one prints out Invalid Value 

    glDrawArrays(GL_POINTS,0,dataW.size()); 

    glEndTransformFeedback(); 
    glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); 
    glDisable(GL_RASTERIZER_DISCARD); 

    //retrieve updated data 
    glGetQueryObjectuiv(query, GL_QUERY_RESULT, &count); //count is 0 -> nothing happend 

    glBindVertexArray(0); 
    glDisableVertexAttribArray(shader.getAttributeIndex("speed")); 

    glDeleteQueries(1, &query); 

    App.Display(); 
    //some other benchmark stuff 
} 

쉐이더. sp가 사용되지 않으면 GLSL이이를 지울 것입니다. 여러 개의 변형이있는 훨씬 큰 코드에서이 코드를 추출 할 때 약간의 사소한 버그가있을 수 있습니다.

+0

셰이더 클래스 구현을 게시 할 수 있습니까? 또한 어떤 플랫폼을 실행 중인지, 드라이버 버전은 무엇인지 알려주십시오. – kvark

+0

실험을 반복하되 프래그먼트 쉐이더가 프로그램에 첨부되지 않았 으면 좋겠습니까 (정점 만)? GLSL 컴파일러에 의해 최적화 된'sp' 값에 대해서는 걱정하지 마십시오. (나는 FP 컴포넌트가 붙지 않은 TF 쉐이더를 가지고 있습니다.) – kvark

+0

글쎄, 나는 샘플 팩이 모든 것을 쉽고 간단하게 처리 할 수 ​​있기 때문에 실제로 그 점을 이해할 수 있다고 생각한다. 하지만 누군가가 나를 돕는 것보다 더 많은 것을 요구할 수는 없다. 셰이더 클래스가 편집 중이며, 윈도우 7, ATI radeon 3870HD에서 실행 중이다. OpenGL 버전 6.14.10.9901 (arround 3.3)과 함께 Catalyst Control Center 10.6. 조각 쉐이더를 "void main() {}"으로 지우면 같은 오류가 발생합니다. 로드에서 셰이더를 제외하면 같은 오류가 발생합니다 .. – Raven

답변

4

OpenGL Samples Pack을 살펴보십시오. ogl-330-transform-feedback.cpp 및 ogl-400-transform-feedback-object.cpp에 관심이있을 수 있습니다. 최신 드라이버에 제공된 예제와 관련된 문제가 있는지 여부도 확인하십시오 (January 2011 OpenGL drivers status).

행운을 빈다.

+0

이 샘플들은 결국 어둠에서 나를 안내 할 수있을 것 같습니다 : D 예, 그들은 내가 필요로하는 것이 완벽합니다. 그래도 내 응용 프로그램을 조금이라도 다시 작성해야 마침내 작동 할 수 있기를 바랍니다. 나는 그들이 vertexArray와 feedbackBuffer ..와 같은 버퍼 객체를 바인딩하고 있다는 것을 알아 냈다. 그리고 포인터에서 포인터를 지정해야한다는 점을 알아 냈다. – Raven

0

당신은 오우거 3D를 체크 아웃 할 수는 : http://www.ogre3d.org/forums/viewtopic.php?p=299736

그들은 피드백을 변환하는 작업 구현을 갖고있는 것 같다.

+1

uhm 그것은 더미에서 바늘을 찾는 것과 같을 것이다. 그러나 누군가 누군가 뭔가를 게시 할 때까지 나는 그것을 통과 시키려고 노력할 것이다. 어디에서 시작할 지 알 것 같지만 오거는 큰 엔진이며 다른 코드에 숨겨진 초기화가있을 수 있습니다. 빠른 답변을 주셔서 감사합니다! :) – Raven

+0

좋아, 그걸 파 내고 뭔가 발견했다. 나는 호출의 순서를 바꿨지 만, 여전히 glBeginTranformFeedback과 glEndTransformFeedback에 오류를 준다. 그들이 대형 인터페이스를 사용하고 있다는 것 이외의 첫 번째 차이점은 여전히 ​​NV 확장을 사용하고 있지만 ATI에서 실행 중이며 인터리브 된 배열을 사용하고 있지만 별도로 필요하다는 것입니다. 어쨌든 이러한 오류를 작성해서는 안되므로 무언가 잘못되었습니다. – Raven

1

Daniel Rakos는 OpenGL에서 변환 피드백을 사용하여 인스턴스 컬링을 구현하는 소스 코드 데모를 제공합니다. 그것은보고 도움이 될 수 있습니다 : 나는 또한 glBeginTransformFeedback는 "잘못된 작업"을 생성하는 유사한 문제가 발생

http://rastergrid.com/blog/2010/02/instance-culling-using-geometry-shaders/

+0

1. 좋은 프로그램, 이제는 내 문제가 드라이버/카드와 관련이 없다는 것을 안다. 거기에 소스 코드도 있습니다 .. mhmm 맛있는 .. 2. (정보 만) 그는 6-7 프레임, 나 70-210에서 뛰고 있었어. LOL 그리고 그것은 단지 하나의 시리즈 차이다 : D – Raven

0

. 내가 파일의 소스 코드를 읽은 후 "GL-440--feedback.cpp 변환"ORHUN에서 제공하는 패키지에서, 나는

glEnable(GL_RASTERIZER_DISCARD); 

전에 glBeginTransformFeedback() 전화를 추가하는 것은 단지 문제를 해결할 수 있음을 발견했다.

희망이 도움이 될 수 있습니다.

+0

나는 필요가 없었다. 그것을 내 솔루션에서 사용하되 도움이 되었기 때문에 기쁩니다. 당신이보고 싶으면, 그것은 내 셰이더 라이브러리의 일부입니다 : https://github.com/BetaRavener/UniShader/blob/master/src/UniShader/ShaderOutput.cpp. 이것은 OpenGL 3.3에 대해 개발되었습니다. – Raven