2013-09-07 15 views
5

Opengl için oldukça yeni ve burada neler olup bittiğini anlamıyorum. Birden çok nesne oluşturmak için iki VAO kullanmaya çalışıyorum ve bunları döndürmek/çevirmek için özel bir matris kullanıyorum. Bir tane yüklediğimde görüntü iyi, ama iki tane yüklediğimde ikisi de titreşiyor. Her bir arabellek, köşe konumu, köşe indeksleri ve köşe renkleri için farklı bir dizilim var. birden çok nesneyi görüntülerken opengl titriyor

void init() 
{ 
readFile(); 
//glEnable(GL_DEPTH); 
glEnable(GL_DEPTH_TEST); 
//make background yerpul in colour 
glClearColor(0.235, 0.194, 0.314, 1.0); 


    // Load shaders and use the resulting shader program 
    program = InitShader("aVertexShader61.glsl", "aFragShader61.glsl"); 
    glUseProgram(program); 

    // Create a vertex array object 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 

    // Create and initialize two buffer objects 
    glGenBuffers(2, buffers); 

    //one buffer for the vertexPositions and colours 
    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
    glBufferData(GL_ARRAY_BUFFER, numVertexPositionBytes + numVertexColourBytes,NULL, GL_STATIC_DRAW); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, numVertexPositionBytes, vertexPositions); 
    glBufferSubData(GL_ARRAY_BUFFER, numVertexPositionBytes, numVertexColourBytes, vertexColours); 

    //one buffer for the indices 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, numVertexIndexBytes,vertexIndicies, GL_STATIC_DRAW); 

    // set up vertex arrays 
    GLuint vPosition = glGetAttribLocation(program, "vPosition"); 
    glEnableVertexAttribArray(vPosition); 
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

    GLuint vColor = glGetAttribLocation(program, "vColor"); 
    glEnableVertexAttribArray(vColor); 
    glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVertexPositionBytes)); 

    // Second object 

    glGenVertexArrays(1, &vao2); 
    glBindVertexArray(vao2); 

    glGenBuffers(2, buffers2); 

    //one buffer for the vertexPositions and colours 
    glBindBuffer(GL_ARRAY_BUFFER, buffers2[0]); 
    glBufferData(GL_ARRAY_BUFFER, numVertexPositionBytes + numVertexColourBytes,NULL, GL_STATIC_DRAW); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, numVertexPositionBytes, vertexPositions2); 
    glBufferSubData(GL_ARRAY_BUFFER, numVertexPositionBytes, numVertexColourBytes, vertexColours2); 

    //one buffer for the indices 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers2[1]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, numVertexIndexBytes,vertexIndicies2, GL_STATIC_DRAW); 

    // set up vertex arrays 
    GLuint vPosition2 = glGetAttribLocation(program, "vPosition"); 
    glEnableVertexAttribArray(vPosition2); 
    glVertexAttribPointer(vPosition2, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

    GLuint vColor2 = glGetAttribLocation(program, "vColor"); 
    glEnableVertexAttribArray(vColor2); 
    glVertexAttribPointer(vColor2, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVertexPositionBytes)); 


    glBindVertexArray(0); 
} 

Bu

glutPostRedisplay() ile çağrılan görüntülü olduğu; boşta çalışmamda, boşta hiçbir şey yapılmıyor. mStack Basit köşe ve fragman shader'lar kullanıyorum

void 
    display(void) 
{ 

    //clear for first object, generate matrix and apply to object 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    mStack.loadIdentity(); 
    mStack.translatef(0,yDisplace,0); 
    mStack.rotatef(Theta[Yaxis], 0.0,1.0,0.0); 
    for (unsigned char i=0; i<NumVertices; i++){ 
     mStack.transformf(&vertexPositionsInit[i*4],&vertexPositions[i*4]); 

    } 

    //Apply to second object 
    for (unsigned char i=0; i<NumVertices; i++){ 
     mStack.transformf(&vertexPositionsInit2[i*4],&vertexPositions2[i*4]); 

    } 


    //Draw first object 
    glBindVertexArray(vao); 
    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, numVertexPositionBytes, vertexPositions); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); 
    //Indexing into vertices we need to use glDrawElements 
    glDrawElements(GL_TRIANGLES, NumIndicies, GL_UNSIGNED_BYTE, 0); 
    glutSwapBuffers(); 


    //Clear and draw second object 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glutSwapBuffers(); 
    glBindVertexArray(vao2); 
    glBindBuffer(GL_ARRAY_BUFFER, buffers2[0]); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, numVertexPositionBytes, vertexPositions2); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers2[1]); 
    //Indexing into vertices we need to use glDrawElements 
    glDrawElements(GL_TRIANGLES, NumIndicies, GL_UNSIGNED_BYTE, 0); 
    glutSwapBuffers(); 


} 

harici dosyasından oluşturulan bir matris yığın amacıdır. tepe tarayıcı,

in vec4 vPosition; 
in vec4 vColor; 
out vec4 color; 

void main() 
{ 
    gl_Position = vPosition; 
    color = vColor; 
} 

Ve fragman shader,

in vec4 color; 
out vec4 fColor; 

void main() 
{ 
    fColor = color; 
} 

Herhangi bir yardım mutluluk duyacağız ve gerekirse ben Matris dosyasını gönderebilirsiniz. Teşekkürler

+0

Yan not: Kullandığınız gölgelendiricilere "geçiş" gölgelendiricileri denir; yani, gölgelendiriciler kullanmıyorsanız aynı çıktıyı elde edersiniz. Bu matris kodunun çoğu gölgelendiricilere gidebilir, ancak bir anda bir şeyi düzeltirsiniz. :) –

+0

, bu matris hesaplamalarının neden olduğu bir sorun olabilir mi? Arabellek sorunu olması gerektiğini düşündüm, bu yüzden matris kodunu eklemedim ama gerçekten hiçbir fikrim yok. – user2755996

+0

Matris kodu, nesnesinin nerede olduğunu belirler. Bir nesneyi görüyorsanız ama yanıp sönüyorsa veya iz bırakıyorsanız, bu bir matris problemi değildir. –

cevap

5

Nesneler arasında glutSwapBuffers() veya glClear()'u arama. Değişken tamponlar, GLUT'a "Tamam, bu çerçeveyle bitirdim, bir sonrakiyle başlayalım" demenin bir yoludur. Genellikle

OpenGL temelde küresel değişkenler dev kutu ve çünkü o, her nesneyi kılmaktadır kodundan (glClear() çağrı ve glutSwapBuffers() gibi) her kareyi kurar ve tamamlar kodunu bölmek isteyeceksiniz yöntemlerinizi küçük parçalara ayırmadan iyi OpenGL kodu yazmak zor.

+0

Yanıt için teşekkürler, açık ve takas tamponları yorumladı ve şimdi ikinci nesne bir çerçeve ve arka plan titrek bir iz bırakır: s – user2755996

+0

Bunların hepsini mi, yoksa sadece nesneler arasındakileri mi? Başlangıçta hala bir glClear() ve sonunda bir glutSwapBuffers() gerekir. Kodun bir nesne için çalışıp sanki hepsini kopyalaması gibi bir şey var gibi görünüyor, ancak bu çağrıların bazıları çerçeveye göre bir kerede ve diğerleri de nesne başına bir kez. –

+0

Bunu yaptım :), daha önce her iki bölüm için de çizim bölümünün sonu yerine her nesnenin sonunda bir takas arabellekleri vardı. Çok teşekkürler Steve – user2755996