gpt4 book ai didi

c++ - OpenGL 深度不工作,三角形消失

转载 作者:搜寻专家 更新时间:2023-10-31 00:18:17 25 4
gpt4 key购买 nike

出于某种原因,我无法检测到我无法为任何三角形设置 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;
}

还有我的 Sprite 文件:

#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);
}

最佳答案

glEnable(GL_BLEND | GL_DEPTH_TEST);

你不能像这样组合这些,你必须发出两个 glEnable 命令。这可能会产生错误,或启用完全不同的东西。

您将其与使用按位掩码的 glClear 混淆了。

开始在您的代码中使用 glGetError,它会为您捕获这个问题。

关于c++ - OpenGL 深度不工作,三角形消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11025436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com