2011-02-11 21 views
6

GLSL 1.50, openGL 3.3.Dönüştürme Geri Bildiriminin tam kurulumu (openGL)

Son zamanlarda transformasyon geri bildirimimi almaya çalışıyorum ama başarılı olamadım. Ben hala glBeginTranformFeedback() sonra hata alıyorum ve ben tam bir çalışma kodu bulamadığım ve bulduğum bazı kodlarla bilgi biriktirdiğimi ve belgelemeyi buldum, şu an iyi çalışıyor olmalıyım ama bir şeyleri özlüyorum. Eğer herhangi bir kişi tam kod aldıysa (tamponların başlatılması, ayarlanması, güncellenmesi, oluşturulması, geri okunması) bu kesinlikle yardımcı olacaktır ve eğer ne olup bittiğini bilmiyorsanız koduma bakabilirsiniz. Ben, bazı kıyaslama dışlanan pencerelerin işleme ve yaratilmasindan: Sadece GLSL iyileştirmesi için orada vert

#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); 
} 

frag

#version 150 core 
varying vec3 sp; 

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

Fragment shader:

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 
} 

gölgelendiriciler. Eğer sp kullanılmazsa GLSL onu temizleyecekti. Bazı küçük hatalar olabileceği gibi, bunu daha büyük kodlardan ayıklayan çoklu değişikliklerle ayıklayabilirim.

+0

Gölgelendirme sınıfı uygulaması yayınlayabilir misiniz? Ayrıca, hangi platformda çalıştığınızı ve sürücü sürümünün ne olduğunu bize bildirin. – kvark

+0

Denemeyi tekrarlamanızı rica edebilirim, fakat programa eklenmiş parça gölgelendiricisi yokken (sadece tepe noktası)? GLSL derleyicisi tarafından optimize edilen sp 'değeri hakkında endişelenmeyin - olmayacak (hiçbir FP bileşeni takılı olmadan tonlarca TF shader'ım var). – kvark

+0

Evet, sanırım o örnek paketin her şeyi basit ve kolay bir şekilde aldığından bu noktadan gerçekten alabilirim. Ama birisinin bana yardım etmesinden daha fazlasını isteyemem, böylece sınıfta düzenleme sınıfı olacak, Windows 7'de koşuyorum, ATI radeon 3870HD. OpenGL sürüm 6.14.10.9901 ile Catalyst Kontrol Merkezi 10.6 (bir şey civarı 3.3). Fragman gölgelendiricisini "void main() {}" ile temizlemek aynı hatayı verir. Gölgelendiriciden yükleme yapmak aynı hatayı verir. – Raven

cevap

4

OpenGL Samples Pack'a bir göz atın. Ogl-330-transform-feedback.cpp ve ogl-400-transform-feedback-object.cpp ile ilgilenebilirsiniz. En son sürücülere verilen örneklerle ilgili sorun olup olmadığını January 2011 OpenGL drivers status numaralı telefondan kontrol edebilirsiniz.

İyi şanslar.

+0

Bu örneklerin nihayet karanlıktan bana rehberlik edeceği gibi görünüyor: D Evet, ihtiyacım olan şey tam olarak. Uygulamamı biraz yeniden inşa etmem gerekecek, dolayısıyla umarım sonunda işe yarar. VertexArray ve feedbackBuffer .. ile aynı arabellek nesnesini bağladıklarını fark ettim ve bu noktadan işaretçiyi belirtmeleri gerekiyor .. bu – Raven

0

Sen Ogre 3D kontrol etmek isteyebilirsiniz: http://www.ogre3d.org/forums/viewtopic.php?p=299736

Onlar geribildirim dönüşümü bir çalışma uygulaması var gibi.

+1

uhm, yığın içinde iğne aramak gibi olacaktır ama birisi daha iyi bir şey yayınlayana kadar bunun üzerinden geçmeye çalışacağım. Nereden başlayacağımı biliyorum, ancak ogre büyük bir motor ve diğer kodlarda gizlenmiş bazı başlatmalar olabilir. Yine de hızlı cevap için teşekkürler! :) – Raven

+0

Tamam kazdım ve bir şey buldum. Çağrı sırasını değiştirdim ancak glEndTransformFeedback'de glEndTransformFeedback'de olduğu gibi hala hata veriyor. Büyük arabirimlerini kullandıkları dışında bir ilk fark, hala NV uzantısını kullanıyor olmaları, ancak ATI üzerinde çalışıyorum ve aralıklı diziler kullanıyorlar ama ayrı bir yere ihtiyacım var. Bu hatayı bir daha yazmamak için yanlış yazmamalı. – Raven

1

Daniel Rakos, OpenGL üzerinde dönüşüm geri bildirimi kullanarak örnek silme uygulayarak kaynak kodlu bir demo'ya sahiptir. Ona bakmak için yardımcı olabilir: Ben de glBeginTransformFeedback "geçersiz işlem" oluşturduğunu benzer bir sorun yaşadı

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

+0

1. güzel program olmalı, şimdi sorunumun sürücünün/kartın ilgili olmadığını biliyorum. Ayrıca bir kaynak kodu var .. mhmm lezzetli .. 2. (sadece bilgi için) o 6-7 çerçeveleri, 70-210 de koşuyordu .. lol ve sadece bir dizi fark: D – Raven

0

. Ben dosyada kaynak kodu okuduktan sonra "gl-440-feedback.cpp dönüşümü" Orhun tarafından sağlanan paketinden, ben

glEnable(GL_RASTERIZER_DISCARD); 

önce glBeginTransformFeedback() çağrıyı ekleyerek sadece sorunu çözer bulundu.

Bu yardımcı olabilir umarım.

+0

Ben yoktu Benim çözümümde kullan, ama yardım ettiğine sevindim. Görmek istediğiniz durumda, bu bizim shaders kütüphanemde bir parçasıdır: https://github.com/BetaRavener/UniShader/blob/master/src/UniShader/ShaderOutput.cpp. Bunun OpenGL 3.3'e karşı geliştirildiğini unutmayın. – Raven