使用 openGL/SDL 绘制点

Posted

技术标签:

【中文标题】使用 openGL/SDL 绘制点【英文标题】:Drawing points using openGL/SDL 【发布时间】:2016-10-16 17:49:19 【问题描述】:

我正在尝试跟踪我的手,然后对于每个 x,y 我将在 openGL 窗口上绘制一个点。

这是我的代码:

#include "GraphicsEffects.h"
#include "Errors.h"

GraphicsEffects::GraphicsEffects():
 _vboID(0)



void GraphicsEffects::init()
SDL_Init(SDL_INIT_EVERYTHING);
_window = SDL_CreateWindow("2D Painting", SDL_WINDOWPOS_CENTERED,       SDL_WINDOWPOS_CENTERED , 600, 600, SDL_WINDOW_OPENGL);

if(_window == nullptr)
    fatalError("SDL window could not be created! "); 


SDL_GLContext glContext = SDL_GL_CreateContext(_window);
if(glContext == nullptr) 
    fatalError("SDL_GL context could not be created!");


GLenum error = glewInit();
if(error != GLEW_OK)
    fatalError("Could not initialize glew!");


SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

if(_vboID == 0)
    glGenBuffers(1, &_vboID);


_colorProgram.compileShaders("Shaders/color.vert", "Shaders/color.frag");
_colorProgram.addAttribute("vertexPosition");
_colorProgram.linkShaders();




void GraphicsEffects::draw(int x, int y)
int pointData[2];
pointData[0] = x;
pointData[1] = y;

glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

_colorProgram.use();

glBindBuffer(GL_ARRAY_BUFFER, _vboID);

glBufferData(GL_ARRAY_BUFFER, sizeof(pointData), pointData, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 0, 0);

glDrawArrays(GL_POINT, 0, 1);

glBindBuffer(GL_ARRAY_BUFFER, 0);

_colorProgram.unuse();

SDL_GL_SwapWindow(_window);



对于 Shaders/color.vert :“顶点着色器文件”

#version 130

in vec2 vertexPosition;

void main() 
    gl_Position.xy = vertexPosition;
    gl_Position.z = 0;
    gl_Position.w = 1.0;

对于 Shader/color.frag:“片段着色器”

#version 130 

out vec4 color ;

void main() 
    color = vec4(1.0, 1.0, 0.0, 1.0);

我预计我的 (x,y) 动作会得到分数,但窗口上什么也没有出现!

【问题讨论】:

【参考方案1】:

这一行

glDrawArrays(GL_POINT, 0, 1);

将产生一个GL_INVALID_ENUM 错误并且不执行任何其他操作。正确的值是GL_POINTS,而不是GL_POINT

您确实应该添加错误检查,至少对于开发版本。如果可能,请查看较新 OpenGL 版本的 debug output functionality。

【讨论】:

感谢您的回复,但我的窗户上仍然没有任何东西! 那么,您使用的坐标是多少?由于你在VS中不做任何变换,将w留为1,你将直接在标准化的设备空间中绘制,即[-1, 1]。由于您使用整数坐标,因此您几乎看不到任何东西,除了 (0,0) 的情况,它应该在窗口中心结束。 好的,我将我的 x,y 更改为浮动并尝试了一些值,例如 (0.4 , 0.7),但什么也没出现!

以上是关于使用 openGL/SDL 绘制点的主要内容,如果未能解决你的问题,请参考以下文章

即使很难,OpenGL、SDL 和 GLSL 都不会抛出错误,没有绘制多边形

OpenGL + SDL + glew 初始化成功后不绘制任何东西

神秘的 OpenGL/SDL 内存增长

OpenGL + SDL 有时会从坐标中提取

OpenGL / SDL2:模板缓冲区位在 PC 上始终为 0

我的 C++ OpenGL SDL 程序没有按预期工作