c++ 如何使用OpenGL在2D模式下渲染完美的线框矩形?

栏目: C++ · 发布时间: 7年前

内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/10320332/how-to-render-perfect-wireframed-rectangle-in-2d-mode-with-opengl

编辑:只是这样你知道:我还没有完全解决这个问题,目前我使用的是0.5px的偏移,似乎有效,但正如其他人所说,这不是“正确”的解决方案.所以我正在寻找真正的交易,钻石出口规则解决方案根本没有工作.

我相信这可能是显卡的错误,但如果是,那么任何专业的 程序员 都应该有这样的防弹解决方案呢?

编辑:我现在买了一个新的nvidia卡(以前有ATI卡),我仍然遇到这个问题.我也在许多游戏中看到同样的错误.所以我想这是不可能修复一个干净的方式?

这是错误的形象:

你如何克服这个问题?如果可能,最好是非着色器解决方案.我试图设置第一行的偏移量,当我自己绘制4个单独的行,而不是使用线框模式,但没有很好的工作:如果矩形大小改变,它有时看起来完美的矩形,但有时甚至比我的修复之前更糟.

这是我渲染四边形的方式:

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_QUADS);
    glVertex2f(...);
    glVertex2f(...);
    glVertex2f(...);
    glVertex2f(...);
glEnd();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

是的,我知道我可以使用顶点数组或VBO,但这不是重点.

我也试过GL_LINE_LOOP,但它没有修复这个错误.

编辑:一个解决方案,迄今为止工作: Opengl pixel perfect 2D drawing by Lie Ryan:

Note that OpenGL coordinate space has no notion of integers,

everything is a float and the “centre” of an OpenGL pixel is really at

the 0.5,0.5 instead of its top-left corner. Therefore, if you want a

1px wide line from 0,0 to 10,10 inclusive,

you really had to draw a

line from 0.5,0.5 to 10.5,10.5.

This will be especially apparent if you turn on anti-aliasing, if you

have anti-aliasing and you try to draw from 50,0 to 50,100 you may see

a blurry 2px wide line because the line fell in-between two pixels.

这不是一个bug,这正是遵循规范.没有绘制一行的最后一个像素,以防止使用以下线段进行过度绘制,这会导致混合问题.解决方案:发送最后一个顶点两次.

代码更新

// don't use glPolygonMode, it doesn't
// do what you think it does
glBegin(GL_LINE_STRIP);
    glVertex2f(a);
    glVertex2f(b);
    glVertex2f(c);
    glVertex2f(d);
    glVertex2f(a);
    glVertex2f(a); // resend last vertex another time, to close the loop
glEnd();

BTW:你应该学习如何使用顶点数组.立即模式(glBegin,glEnd,glVertex调用)已经从OpenGL-3.x内核和之后移除.

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/10320332/how-to-render-perfect-wireframed-rectangle-in-2d-mode-with-opengl


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

信息简史

信息简史

[美] 詹姆斯·格雷克 / 高博 / 人民邮电出版社 / 2013-10 / 69.00元

人类与信息遭遇的历史由来已久。詹姆斯•格雷克笔下的这段历史出人意料地从非洲的鼓语讲起(第1章)。非洲土著部落在尚未直接跨越到移动电话之前,曾用鼓声来传递讯息,但他们是如何做到的呢?后续章节进而讲述了这段历史上几个影响深远的关键事件,包括文字的发明(第2章)、罗伯特•考德里的第一本英语词典(第3章)、查尔斯•巴贝奇的差分机与爱达•拜伦的程序(第4章)、沙普兄弟的信号塔与摩尔斯电码(第5章)。 ......一起来看看 《信息简史》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器