由于某种原因,我无法检测到我无法为任何三角形设置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);
用我的vertext着色器:
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);
}
Vertex着色器:(注意,解析器添加了版本)
attribute vec2 coord2d;
uniform mat4 translationUniform;
uniform mat4 camera;
void main(void) {
gl_Position = camera * vec4(coord2d, -1.1, 1.0);
}
答案 0 :(得分:3)
glEnable(GL_BLEND | GL_DEPTH_TEST);
你不能将这些结合起来,你必须发出两个glEnable命令。这可能会产生错误,或者使某些东西完全不同。
你将这与使用按位掩码的glClear混淆。
在您的代码中开始使用glGetError
,它会为您解决此问题。
答案 1 :(得分:3)
好的,我重读了这个问题,我想我现在明白了。
三角形在-1到1之外消失,因为没有任何投影矩阵,您将绘制标准化的设备坐标,其具有-1到1的近和远剪裁平面。这意味着任何具有外部z值的顶点-1到1将被淘汰。
其次,你说你不会看到距离变小。这是透视投影的一个功能,您没有(因为您没有投影矩阵)。使用默认投影矩阵(正交),您将无法获得任何透视缩短,因此无论距离如何,您的三角形都将显示相同的大小。如果你想对你的场景应用透视,那么你需要一个透视矩阵:尝试应用gluPerspective(1, 45, 0.1, 100);
这应该给你一些更像你期望的东西(三角形将出现z从-0.1到-100,变小因为它接近z = -100)。您可能需要调整这些以匹配场景的比例。