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.
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
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
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