C++ 在OpenGL中绘制像素

C++ 在OpenGL中绘制像素,c++,opengl,graphics,C++,Opengl,Graphics,我在大学里学习计算机图形学。我需要在现代OpenGL(3.3+)中实现基本的线条绘制算法,以便在屏幕上绘制原语。这是我想要实现的Bresenham的线条绘制算法的函数- void bresenham(闪烁xStart、闪烁yStart、闪烁xEnd、闪烁yEnd){ 如果(!(xStart

我在大学里学习计算机图形学。我需要在现代OpenGL(3.3+)中实现基本的线条绘制算法,以便在屏幕上绘制原语。这是我想要实现的Bresenham的线条绘制算法的函数-

void bresenham(闪烁xStart、闪烁yStart、闪烁xEnd、闪烁yEnd){
如果(!(xStart
我不知道如何实现
setPixel()
函数。我在这里和其他地方找到的大多数答案都使用了较旧的OpenGL函数-

void setPixel(int x,int y)
{
glColor3f(0.0,0.0,0.0);//将像素设置为黑色
glBegin(总分);
glVertex2i(x,y);//设置像素坐标
格伦德();
glFlush();//渲染像素
}
在OpenGl 3.3+中实现这一点的等效方法是什么? 假设我可以将“像素”添加到
std::vector
数组中,如何初始化顶点缓冲区数组以存储此数据

我在尝试使用
GL_POINTS
绘制点时遇到的另一个问题是,由于在转换到标准化设备坐标期间进行了剪裁,窗口上不会显示任何方向上超出范围[-1,1]的点

例如,只有前三个点显示在窗口屏幕上。请参阅
initialize()
函数-

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//从文件中读取着色器源
//将着色器源存储在std::vector中
void read_shader_src(const char*fname,std::vector&buffer);
//编译着色器
GLuint加载和编译着色器(const char*fname,GLenum shaderType);
//从两个着色器创建程序
GLuint create_程序(const char*path\u vert\u着色器,const char*path\u frag\u着色器);
//渲染场景
无效显示(GLuint&vao、GLFWwindow*窗口);
//初始化要呈现的数据
无效初始化(GLuint&vao);
//GLFW回调
静态无效错误\u回调(int错误,常量字符*说明){
fprintf(标准,“错误:%s\n”,说明);
}
静态无效键_回调(GLFWwindow*窗口、int键、int扫描码、int操作、int mods){
如果(键==GLFW\U键\转义和操作==GLFW\U按){
glfwSetWindowShouldClose(窗口,GL_TRUE);
}
}
int main(){
glfwSetErrorCallback(错误回调);
//初始化GLFW
如果(!glfwInit()){
fprintf(stderr,“初始化GLFW失败。\n”);
返回-1;
}
//设置GLFW窗口设置并创建窗口
glfwWindowHint(GLFW_上下文_版本_专业,3);
glfwWindowHint(GLFW_上下文_版本_小调,3);
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
GLFWwindow*window=glfwCreateWindow(500500,“我的窗口”,NULL,NULL);
如果(!窗口){
fprintf(stderr,“窗口或上下文创建失败。\n”);
返回-1;
}
glfwSetKeyCallback(窗口、键回调);
glfwMakeContextCurrent(窗口);
//初始化GLEW
glewExperimental=GL_TRUE;
如果(glewInit()!=GLEW\u确定){
fprintf(stderr,“未能初始化glew”);
glfwTerminate();
返回-1;
}
//创建顶点数组对象
GLuint-vao;
//初始化要呈现的数据
初始化(vao);
而(!glfwWindowShouldClose(窗口)){
显示器(vao,窗口);
glfwPollEvents();
}
glfwTerminate();
返回0;
}
//渲染场景
无效显示(GLuint&vao,GLFWwindow*窗口){
//红色背景
glClearColor(1.0f、0.0f、0.0f、0.0f);
glClear(GLU颜色缓冲位);
glBindVertexArray(vao);
GLDrawArray(GLU点,0,12);
//交换前后缓冲区
glfwSwapBuffers(窗口);
}
无效初始化(GLuint和vao){
glEnable(德国劳埃德船级社计划点尺寸);
//使用顶点数组对象
glGenVertexArrays(1和vao);
glBindVertexArray(vao);
//在数组中存储verex位置
GLfloat顶点[24]={
0.0,0.0,//只有这些
0.5,0.5,//显示三个点
1.0,1.0,//在窗口屏幕上
4.0, 4.0,
5.0, 5.0,
6.0, 6.0,
7.0, 7.0,
8.0, 8.0,
9.0, 9.0,
10.0, 10.0,
11.0, 11.0,
12.0, 12.0,
};
//创建顶点缓冲区对象以存储顶点数据
GLuint vbo;
//生成1个缓冲区对象名并将其存储在vbo中
glGenBuffers(1,&vbo);
//将缓冲区对象绑定到缓冲区绑定目标
glBindBuffer(GL_数组_BUFFER,vbo);
//创建并初始化缓冲区对象的数据存储(使用来自顶点的数据)
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态图);
GLuint shaderProgram=create_程序(“/Users/../vert.shader”,“/Users/../frag.shader”);//着色器文件的路径
//获取在顶点着色器中输入的属性的位置
GLint posAttrib=glGetAttribLocation(着色器程序,“位置”);
//指定如何访问位置的数据
glvertexattributepointer(posAttrib,2,GL_FLOAT,GL_FALSE,0,0);
//启用该属性
glEnableVertexAttribArray(posAttrib);
}
//从文件中读取着色器源
//将着色器源存储在std::vector中
void read_shader_src(const char*fname,std::vector&buffer){
std::ifstream-in;
in.open(fname,std::ios::binary);
if(in.is_open()){
//获取此文件中存储的字节数
in.seekg(0,std::ios::end);
size_t length=(size_t)in.tellg();
//转到文件的开头
in.seekg(0,std::ios::beg);
//读取缓冲区中文件的内容
buffer.resiz
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_FLOAT, pixels);
glBindTexture(GL_TEXTURE_2D, 0);
GLfloat vertices[] = {
//  Position      Color             Texcoords
    -0.5f,  0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left
     0.5f,  0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right
     0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right
    -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f  // Bottom-left
};

GLuint elements[] = {
    0, 1, 2,
    2, 3, 0
};

// Set up buffer objects, create shaders, initialize GL, etc.

//drawing
//bind buffers, enable attrib arrays, etc
glBindTexture(GL_TEXTURE_2D, tex);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);