私はopenglには新しく、ここで何が起こっているのか分かりません。私は、複数のオブジェクトを作成するために2つのVAOを使用しようとしているし、それらを回転/変換するカスタムマトリックスを使用しています。画像をロードすると画像が上手くなりますが、2つをロードすると両方がちらつきます。私のinitはこれです。バッファ、頂点の位置、頂点のインデックス、頂点の色ごとに異なる配列があります。複数のオブジェクトをレンダリングしている間に、openglがちらつく
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);
}
これはglutPostRedisplay()で呼び出される私のディスプレイです。私のアイドル機能では、アイドルから何かへの他の呼び出しは行われません。 mStackは外部ファイルから作成された行列スタックオブジェクトです
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();
}
私は単純な頂点シェーダとフラグメントシェーダを使用しています。 頂点シェーダ、
in vec4 vPosition;
in vec4 vColor;
out vec4 color;
void main()
{
gl_Position = vPosition;
color = vColor;
}
とフラグメントシェーダは、
in vec4 color;
out vec4 fColor;
void main()
{
fColor = color;
}
任意の助けをいただければ幸いですし、必要であれば、私はマトリックスファイルを投稿することができます。 ありがとう
サイドノート:使用しているシェーダは「パススルー」シェーダと呼ばれ、シェーダをまったく使用していない場合は同じ出力が得られます。その行列コードの大部分はシェーダーに入ることができますが、もちろん一度に一つのことを修正します。 :) –
これは行列の計算によって引き起こされる問題かもしれませんか?私はそれがバッファーの問題でなければならないと思ったので、私は行列コードを含まなかったのですが、私は本当に分かりません。 – user2755996
マトリックスコードは、オブジェクトがどこにあるかを決定します。オブジェクトが表示されていても、ちらつきやトレイルが残っている場合は、マトリックスの問題ではないでしょう。 –