使用opengl绘制三角形

时间:2022-06-05 04:03:46

1.之前在win编译时出现无法显示的情况,后来在linux测试调试是自已的笔记GPU垃圾,无法支持3.3版本,废了很久才找出原因,还是linux好调试程序

 

2.编写makefile

整个Demo

使用opengl绘制三角形

 

#  
CC = g++
# -O2 : optimization option
# -s : build small binary
# -mwindows : use this option to remove the popping cmd window
CCFLAGS = -O2 -Wall
BIN = Demo
RES =
OBJ = shader.o start.o
# 项目Lib路径
CUBPATH = lib
# 项目头文件路径
CUCPATH = include
# 连接库文件
LIBS=-L. -L$(CUBPATH) -lGL -lGLU -lGLEW -lglfw
INCLU=-I$(CUCPATH) -I.
RM =-rm

# 编译源码
.PHONY:$(BIN)
$(BIN): $(OBJ)
$(CC) $(CCFLAGS) -o $(BIN) $^ $(INCLU) $(LIBS)

shader.o:common/shader.cpp common/shader.hpp
$(CC) $(CCFLAGS) -c $<

start.o:start.cpp
$(CC) $(CCFLAGS) -c $<

# 清理,PHONY避免无依赖时被看成最终目标
.PHONY:clean
clean:
$(RM) $(BIN) $(OBJ)

# 直接运行生成的文件
# .PHONY:run
run:$(BIN)
chmod +x $(BIN)
./$(BIN)


源码,来之官方3.3的教程

// Include standard headers
#include <stdio.h>
#include <stdlib.h>

// Include GLEW
#include <GL/glew.h>

// Include GLFW
#include <GLFW/glfw3.h>
GLFWwindow* window;

// Include GLM
#include <glm/glm.hpp>
using namespace glm;

#include "common/shader.hpp"

int main( void )
{
// Initialise GLFW
if( !glfwInit() )
{
fprintf( stderr, "Failed to initialize GLFW\n" );
return -1;
}

glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

// Open a window and create its OpenGL context
window = glfwCreateWindow( 1024, 768, "Tutorial 02 - Red triangle", NULL, NULL);
if( window == NULL ){
fprintf( stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n" );
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);

// Initialize GLEW
glewExperimental = true; // Needed for core profile
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
return -1;
}

// Ensure we can capture the escape key being pressed below
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

// Dark blue background
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

// Create and compile our GLSL program from the shaders
GLuint programID = LoadShaders( "SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader" );


static const GLfloat g_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f,
};

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

do{

// Clear the screen
glClear( GL_COLOR_BUFFER_BIT );

// Use our shader
glUseProgram(programID);

// 1rst attribute buffer : vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0, // attribute 0. No particular reason for 0, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);

// Draw the triangle !
glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle

glDisableVertexAttribArray(0);

// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();

} // Check if the ESC key was pressed or the window was closed
while( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0 );

// Cleanup VBO
glDeleteBuffers(1, &vertexbuffer);
glDeleteVertexArrays(1, &VertexArrayID);
glDeleteProgram(programID);

// Close OpenGL window and terminate GLFW
glfwTerminate();

return 0;
}

图片来之官方的,由于笔记不支持,又不想用2.+的,只能..

使用opengl绘制三角形