c语言 opengl画仪表盘源码,OpenGL学习——绘制矩形

#include "Rectangles.h"Rectangles::Rectangles(){

}

Rectangles::~Rectangles(){

}voidRectangles::init(){//x,y,z opengl coordinates, the vertex data, three 3d point in normalized device coordinates

GLfloat vertexs[] ={0.5f, 0.5f, 0.0f, //0-right up

0.5f, -0.5f, 0.0f, //1-right down

-0.5f, 0.5f, 0.0f, //2-left up

-0.5f, -0.5f, 0.0f, //3-left down

};//vertex draw index array

GLuint indexs[] ={0, 1, 2,1, 2, 3,

};//define VAO, vertex array object//GLuint VAO;

glGenVertexArrays(1, &VAO);

glBindVertexArray(VAO);//bind vertex array object//define VBO, vertex buffer object

GLuint VBO;

glGenBuffers(1, &VBO); //gen buffer object

glBindBuffer(GL_ARRAY_BUFFER, VBO); //bind buffer to the target

glBufferData(GL_ARRAY_BUFFER, sizeof(vertexs), vertexs, GL_STATIC_DRAW); //copy vertex data to VBO//define EBO, element buffer object

GLuint EBO;

glGenBuffers(1, &EBO);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);

glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indexs), indexs, GL_STATIC_DRAW);//set vertex attribute point

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);

glEnableVertexAttribArray(0);

glBindVertexArray(0);//unbind vertex array object//create shader program

this->createShaderProgram();

}voidRectangles::draw(){//use shader programs

glUseProgram(shaderProgram);//draw the Rectangles

glBindVertexArray(VAO);//glDrawArrays(GL_TRIANGLES, 0, 3);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //GL_LINE set the wireframe mode

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

glBindVertexArray(0);

}voidRectangles::createVertexShader(){//compile vertex shader source

std::string vertexShaderStr = this->getVertexShaderSrc();const char *vertexShaderSrc =vertexShaderStr.c_str();

std::cout<< "vertexShaderSrc:\n" <

vertexShader = glCreateShader(GL_VERTEX_SHADER); //create vertex shader object

glShaderSource(vertexShader, 1, &vertexShaderSrc, NULL); //shader source attach to shader object

glCompileShader(vertexShader); //compile shader//compile result check

GLint success;

GLchar infoLog[512];

glGetShaderiv(vertexShader, GL_COMPILE_STATUS,&success);if (!success){

glGetShaderInfoLog(vertexShader,512, NULL, infoLog);

std::cout<< "vertex shader source compile failed...\n" << infoLog <<:endl>

std::cout<

}

}voidRectangles::createFragmentShader(){//compile fragment shader source

std::string fragmentShaderStr = this->getFragmentShaderSrc();const char *fragmentShaderSrc =fragmentShaderStr.c_str();

std::cout<< "\n\nfragmentShaderSrc:\n" <

fragmentShader =glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(fragmentShader,1, &fragmentShaderSrc, NULL);

glCompileShader(fragmentShader);

}voidRectangles::createShaderProgram(){this->createVertexShader();this->createFragmentShader();if (vertexShader == NULL || fragmentShader ==NULL){return;

}//shader program, link vertex shader object and fragment shader object//GLuint shaderProgram;

shaderProgram = glCreateProgram(); //create shader program

glAttachShader(shaderProgram, vertexShader); //attach vertex shader

glAttachShader(shaderProgram, fragmentShader); //attach fragment shader

glLinkProgram(shaderProgram); //linking//check link result

GLint success;

GLchar infoLog[512];

glGetProgramiv(shaderProgram, GL_LINK_STATUS,&success);if (!success){

glGetProgramInfoLog(shaderProgram,512, NULL, infoLog);

std::cout<< "shader program linking failed...\n" << infoLog <<:endl>

}//delete vertex shader object and fragment shader object

glDeleteShader(vertexShader);

glDeleteShader(fragmentShader);

}

std::stringRectangles::getVertexShaderSrc(){

std::string vertexShaderStr =

"#version 330 core\n"

"layout (location = 0) in vec3 pos;"

"void main () {"

"gl_Position = vec4(pos, 1.0);"

"}";returnvertexShaderStr;

}

std::stringRectangles::getFragmentShaderSrc(){

std::string fragmentShaderStr =

"#version 330 core\n"

"out vec4 color;"

"void main () {"

"color = vec4(1.0f, 0.1f, 0.1f, 1.0f);"

"}";returnfragmentShaderStr;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用OpenGL直线之前,需要先初始化OpenGL环境和窗口,具体可以参考OpenGL的基础教程。 下面是一个简单的OpenGL直线的示例代码: ```c #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT); //清空颜色缓冲区 glBegin(GL_LINES); //开始线 glColor3f(1.0, 0.0, 0.0); //设置线的颜色为红色 glVertex2f(-0.5, 0.0); //设置线的起点坐标 glVertex2f(0.5, 0.0); //设置线的终点坐标 glEnd(); //结束线 glFlush(); //刷新缓冲区 } int main(int argc, char **argv) { glutInit(&argc, argv); //初始化GLUT glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式 glutInitWindowSize(400, 400); //设置窗口大小 glutCreateWindow("OpenGL Line"); //创建窗口 glClearColor(1.0, 1.0, 1.0, 0.0); //设置背景颜色为白色 glMatrixMode(GL_PROJECTION); //设置矩阵模式为投影矩阵 glLoadIdentity(); //初始化矩阵 gluOrtho2D(-1.0, 1.0, -1.0, 1.0); //设置视口大小 glutDisplayFunc(display); //注册显示回调函数 glutMainLoop(); //进入消息循环 return 0; } ``` 在这个示例代码中,我们使用了glBegin()和glEnd()函数来开始和结束线操作,使用glVertex2f()函数来设置线的起点和终点坐标,使用glColor3f()函数来设置线的颜色。 同时,我们还需要在主函数中进行OpenGL环境和窗口的初始化,包括设置显示模式、窗口大小、背景颜色和视口大小等。 最后,我们将display()函数注册为显示回调函数,用于在窗口中显示我们出的直线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值