何らかの理由で、三角形に z インデックスを設定できないことを検出できません。三角形は同じ深さで 1 から -1 (両端を含む) まで表示されますが、その後は消えます。私は MVP マトリックスを適用していません (これを最初に把握しようとしています)。z 値を減らすと、三角形が小さくなることがわかると思います。これは私がこれまでに持っているものです:
//My main function
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_ALPHA|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowSize(640, 480);
glutCreateWindow("Window");
if (init_resources()) {
glutDisplayFunc(onDisplay);
glutIdleFunc(idle);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMainLoop();
}
//And in my display function
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
そして私の頂点シェーダーで:
gl_Position = vec4(coord2d, 0.0, 1.0);
glGetIntegerv(GL_DEPTH_BITS, &depth)
24 も返します。
編集:完全なコード
Sprite *sprite1;
Sprite *sprite2;
GLuint program;
GLuint cameraAttribute;
int init_resources()
{
//Link shaders, create program and attach shaders
GLint link_ok = GL_FALSE;
GLuint vs, fs;
if ((vs = create_shader("vertShader.sh", GL_VERTEX_SHADER)) == 0) return 0;
if ((fs = create_shader("fragShader.sh", GL_FRAGMENT_SHADER)) == 0) return 0;
program = glCreateProgram();
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &link_ok);
if (!link_ok) {
fprintf(stderr, "glLinkProgram:");
print_log(program);
return 0;
}
//Create Attributes
cameraAttribute = glGetUniformLocation(program, "camera");
if(cameraAttribute == -1){
cout << "Error!";
}
//Init sprites
sprite1 = new Sprite();
sprite2 = new Sprite();
return 1;
}
void onDisplay()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glUseProgram(program);
sprite1->render();
sprite2->render();
glutSwapBuffers();
}
void idle()
{
//Create Projection Matrix to change clip space.
mat4 projectionMatrix = perspective(60.0f, (float)glutGet(GLUT_WINDOW_WIDTH) / (float)glutGet(GLUT_WINDOW_HEIGHT), 0.1f, 100.f);
glUniformMatrix4fv(cameraAttribute, 1, GL_FALSE, &projectionMatrix[0][0]);
}
void free_resources()
{
glDeleteProgram(program);
}
int main(int argc, char* argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_ALPHA|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowSize(640, 480);
glutCreateWindow("My Second Triangle");
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
if (init_resources()) {
glutDisplayFunc(onDisplay);
glutIdleFunc(idle);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//uses glGetError to check for how many errors there are.
cout << CheckGLErrors() << "\n";
glutMainLoop();
}
free_resources();
return 0;
}
そして私のスプライトファイル:
#include "Sprite.h"
Sprite::Sprite(){
init();
}
void Sprite::init(){
GLfloat triangle_vertices[] = {
0.0, 0.8f,
-0.8f, -0.8f,
0.8f, -0.8f,
};
//Set attributes
locationAttribute = glGetAttribLocation(program, "coord2d");
if (locationAttribute == -1) {
fprintf(stderr, "Could not bind attribute location");
}
translationUniform = glGetUniformLocation(program, "translationUniform");
if(translationUniform == -1){
fprintf(stderr, "Could not bind attribute transformation");
}
//Create buffer
glGenBuffers(1, &mainBuffer);
glBindBuffer(GL_ARRAY_BUFFER, mainBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_vertices), triangle_vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(
locationAttribute, // attribute
2, // number of elements per vertex, here (x,y)
GL_FLOAT, // the type of each element
GL_FALSE, // take our values as-is
0, // no extra data between each position
0 // offset of first element
);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void Sprite::render(){
glBindBuffer(GL_ARRAY_BUFFER, mainBuffer);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
頂点シェーダー: (注、バージョンはパーサーによって追加されます)
attribute vec2 coord2d;
uniform mat4 translationUniform;
uniform mat4 camera;
void main(void) {
gl_Position = camera * vec4(coord2d, -1.1, 1.0);
}