feat: opengl hello triangle

This commit is contained in:
parker
2025-06-25 23:52:15 +01:00
parent bdfc5822ec
commit 0acc1a0bd9

View File

@@ -1,3 +1,5 @@
#include <GL/gl.h>
#include <GL/glext.h>
#include <QOpenGLWidget> #include <QOpenGLWidget>
#include <iostream> #include <iostream>
#include <QOpenGLFunctions_3_2_Core> #include <QOpenGLFunctions_3_2_Core>
@@ -7,16 +9,78 @@ class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_2_Core
public: public:
MyGLWidget(QWidget *parent) : QOpenGLWidget(parent) { } MyGLWidget(QWidget *parent) : QOpenGLWidget(parent) { }
QSize sizeHint() const override { return QSize(-1, -1); } QSize sizeHint() const override { return QSize(-1, -1); }
GLuint vao;
GLuint shaderProgram;
protected: protected:
void initializeGL() override void initializeGL() override
{ {
// Set up the rendering context, load shaders and other resources, etc.: // Set up the rendering context, load shaders and other resources, etc.:
initializeOpenGLFunctions(); initializeOpenGLFunctions();
GLuint vao;
glGenVertexArrays(1,&vao); glGenVertexArrays(1, &vao);
glBindVertexArray(vao); glBindVertexArray(vao);
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLuint vbo;
// create buffer of vertices
glGenBuffers(1, &vbo);
// set purpose
glBindBuffer(GL_ARRAY_BUFFER, vbo);
// store data in the buffer
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// vertex shader
const std::string vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\n";
GLuint vertexShader;
// shader type
glCreateShader(GL_VERTEX_SHADER);
// convert source
const GLchar* vertexShaderSourceC = vertexShaderSource.c_str();
// create shader object
glShaderSource(vertexShader, 1, &vertexShaderSourceC, NULL);
// compile shader object
glCompileShader(vertexShader);
// fragment shader
const std::string fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n";
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar* fragmentShaderSourceC = fragmentShaderSource.c_str();
glShaderSource(fragmentShader, 1, &fragmentShaderSourceC, NULL);
glCompileShader(fragmentShader);
// create shader program
shaderProgram = glCreateProgram();
// attach shaders
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
// link program
glLinkProgram(shaderProgram);
// delete shaders now that the program is complete
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);
QSurfaceFormat fmt = context()->format(); QSurfaceFormat fmt = context()->format();
std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGLES ? "GLES" : "Desktop") << "\n"; std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGLES ? "GLES" : "Desktop") << "\n";
std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGL ? "true" : "false") << "\n"; std::cout << "format: " << (fmt.renderableType() == QSurfaceFormat::OpenGL ? "true" : "false") << "\n";
@@ -34,6 +98,9 @@ protected:
{ {
initializeOpenGLFunctions(); initializeOpenGLFunctions();
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
} }
}; };