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ıyorumvoid
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
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. :) –
, 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
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. –