- Implemented a new sample application in main.cpp to capture and display a live 3D point cloud using the ZED SDK and OpenGL. - Created test_opengl.cpp to demonstrate basic OpenGL rendering with depth testing using two triangles. - Added test_points.cpp to visualize a grid of colored points in OpenGL, showcasing point rendering capabilities.
229 lines
6.7 KiB
C++
Executable File
229 lines
6.7 KiB
C++
Executable File
#include <GL/glew.h>
|
|
#include <GL/freeglut.h>
|
|
#include <iostream>
|
|
#include <cmath>
|
|
|
|
const char* VERTEX_SHADER =
|
|
"#version 330 core\n"
|
|
"layout(location = 0) in vec3 position;\n"
|
|
"layout(location = 1) in vec3 color;\n"
|
|
"uniform mat4 mvp;\n"
|
|
"out vec3 fragColor;\n"
|
|
"void main() {\n"
|
|
" fragColor = color;\n"
|
|
" gl_Position = mvp * vec4(position, 1.0);\n"
|
|
"}\n";
|
|
|
|
const char* FRAGMENT_SHADER =
|
|
"#version 330 core\n"
|
|
"in vec3 fragColor;\n"
|
|
"out vec4 outColor;\n"
|
|
"void main() {\n"
|
|
" outColor = vec4(fragColor, 1.0);\n"
|
|
"}\n";
|
|
|
|
GLuint shaderProgram;
|
|
GLuint vao, vbo_pos, vbo_color;
|
|
float angle = 0.0f;
|
|
|
|
GLuint compileShader(const char* source, GLenum type) {
|
|
GLuint shader = glCreateShader(type);
|
|
glShaderSource(shader, 1, &source, NULL);
|
|
glCompileShader(shader);
|
|
|
|
GLint success;
|
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
|
|
if (!success) {
|
|
char log[512];
|
|
glGetShaderInfoLog(shader, 512, NULL, log);
|
|
std::cerr << "Shader compilation error: " << log << std::endl;
|
|
}
|
|
return shader;
|
|
}
|
|
|
|
void createShaderProgram() {
|
|
GLuint vertShader = compileShader(VERTEX_SHADER, GL_VERTEX_SHADER);
|
|
GLuint fragShader = compileShader(FRAGMENT_SHADER, GL_FRAGMENT_SHADER);
|
|
|
|
shaderProgram = glCreateProgram();
|
|
glAttachShader(shaderProgram, vertShader);
|
|
glAttachShader(shaderProgram, fragShader);
|
|
glLinkProgram(shaderProgram);
|
|
|
|
GLint success;
|
|
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
|
|
if (!success) {
|
|
char log[512];
|
|
glGetProgramInfoLog(shaderProgram, 512, NULL, log);
|
|
std::cerr << "Shader linking error: " << log << std::endl;
|
|
}
|
|
|
|
glDeleteShader(vertShader);
|
|
glDeleteShader(fragShader);
|
|
}
|
|
|
|
void createGeometry() {
|
|
// Simple triangle vertices
|
|
float vertices[] = {
|
|
// Triangle 1 (large, in front)
|
|
0.0f, 0.5f, 0.0f,
|
|
-0.5f, -0.5f, 0.0f,
|
|
0.5f, -0.5f, 0.0f,
|
|
|
|
// Triangle 2 (smaller, behind)
|
|
0.0f, 0.3f, -2.0f,
|
|
-0.3f, -0.3f, -2.0f,
|
|
0.3f, -0.3f, -2.0f
|
|
};
|
|
|
|
float colors[] = {
|
|
// Triangle 1 colors (RGB at vertices)
|
|
1.0f, 0.0f, 0.0f, // Red
|
|
0.0f, 1.0f, 0.0f, // Green
|
|
0.0f, 0.0f, 1.0f, // Blue
|
|
|
|
// Triangle 2 colors (Yellow)
|
|
1.0f, 1.0f, 0.0f,
|
|
1.0f, 1.0f, 0.0f,
|
|
1.0f, 1.0f, 0.0f
|
|
};
|
|
|
|
glGenVertexArrays(1, &vao);
|
|
glBindVertexArray(vao);
|
|
|
|
glGenBuffers(1, &vbo_pos);
|
|
glBindBuffer(GL_ARRAY_BUFFER, vbo_pos);
|
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
|
|
glEnableVertexAttribArray(0);
|
|
|
|
glGenBuffers(1, &vbo_color);
|
|
glBindBuffer(GL_ARRAY_BUFFER, vbo_color);
|
|
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
|
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
|
|
glEnableVertexAttribArray(1);
|
|
|
|
glBindVertexArray(0);
|
|
}
|
|
|
|
void display() {
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
|
// Test 1: Draw with identity matrix (no depth)
|
|
static bool testDepth = true;
|
|
|
|
if (!testDepth) {
|
|
// Identity - everything should be visible
|
|
float mvp[16] = {
|
|
1.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, 1.0f, 0.0f, 0.0f,
|
|
0.0f, 0.0f, 1.0f, 0.0f,
|
|
0.0f, 0.0f, 0.0f, 1.0f
|
|
};
|
|
|
|
glUseProgram(shaderProgram);
|
|
GLint mvpLoc = glGetUniformLocation(shaderProgram, "mvp");
|
|
glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, mvp);
|
|
|
|
glBindVertexArray(vao);
|
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
|
glBindVertexArray(0);
|
|
} else {
|
|
// Test depth - draw with simple Z translation only
|
|
glUseProgram(shaderProgram);
|
|
GLint mvpLoc = glGetUniformLocation(shaderProgram, "mvp");
|
|
|
|
// Draw first triangle (at Z=0)
|
|
float mvp1[16] = {
|
|
1.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, 1.0f, 0.0f, 0.0f,
|
|
0.0f, 0.0f, 1.0f, 0.0f,
|
|
0.0f, 0.0f, 0.0f, 1.0f
|
|
};
|
|
glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, mvp1);
|
|
glBindVertexArray(vao);
|
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
|
|
|
// Draw second triangle shifted right and with Z offset
|
|
float mvp2[16] = {
|
|
1.0f, 0.0f, 0.0f, 0.0f,
|
|
0.0f, 1.0f, 0.0f, 0.0f,
|
|
0.0f, 0.0f, 1.0f, 0.0f,
|
|
0.4f, 0.0f, -0.5f, 1.0f // Shift right and back in Z
|
|
};
|
|
glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, mvp2);
|
|
glDrawArrays(GL_TRIANGLES, 3, 3);
|
|
|
|
glBindVertexArray(0);
|
|
}
|
|
|
|
glutSwapBuffers();
|
|
|
|
static int frames = 0;
|
|
if (frames++ == 0) {
|
|
std::cout << "\n=== Drawing Test ===" << std::endl;
|
|
std::cout << "You should see TWO triangles:" << std::endl;
|
|
std::cout << "1. RGB triangle on the left (Z=0)" << std::endl;
|
|
std::cout << "2. Yellow triangle on the right (Z=-0.5)" << std::endl;
|
|
std::cout << "\nIf you only see ONE triangle, depth is broken" << std::endl;
|
|
std::cout << "Press 'd' to toggle depth test" << std::endl;
|
|
}
|
|
}
|
|
|
|
void keyboard(unsigned char key, int x, int y) {
|
|
if (key == 'd' || key == 'D') {
|
|
static bool depthEnabled = true;
|
|
depthEnabled = !depthEnabled;
|
|
if (depthEnabled) {
|
|
glEnable(GL_DEPTH_TEST);
|
|
std::cout << "Depth test ENABLED" << std::endl;
|
|
} else {
|
|
glDisable(GL_DEPTH_TEST);
|
|
std::cout << "Depth test DISABLED" << std::endl;
|
|
}
|
|
glutPostRedisplay();
|
|
} else if (key == 27) { // ESC
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
void init() {
|
|
std::cout << "GL Vendor: " << glGetString(GL_VENDOR) << std::endl;
|
|
std::cout << "GL Renderer: " << glGetString(GL_RENDERER) << std::endl;
|
|
std::cout << "GL Version: " << glGetString(GL_VERSION) << std::endl;
|
|
std::cout << "GLSL Version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
|
|
|
|
glClearColor(0.2f, 0.2f, 0.3f, 1.0f);
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
createShaderProgram();
|
|
createGeometry();
|
|
}
|
|
|
|
int main(int argc, char** argv) {
|
|
glutInit(&argc, argv);
|
|
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
|
|
glutInitWindowSize(800, 600);
|
|
glutCreateWindow("Minimal OpenGL Test");
|
|
|
|
GLenum err = glewInit();
|
|
if (err != GLEW_OK) {
|
|
std::cerr << "GLEW Init Error: " << glewGetErrorString(err) << std::endl;
|
|
return 1;
|
|
}
|
|
|
|
init();
|
|
|
|
glutDisplayFunc(display);
|
|
glutKeyboardFunc(keyboard);
|
|
|
|
std::cout << "\n=== Minimal OpenGL Test ===" << std::endl;
|
|
std::cout << "Controls:" << std::endl;
|
|
std::cout << " d - Toggle depth test" << std::endl;
|
|
std::cout << " ESC - Quit" << std::endl;
|
|
|
|
glutMainLoop();
|
|
|
|
return 0;
|
|
}
|