内容简介:代码日志版权声明:翻译自: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
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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- canvas-坐标系、圆角矩形、纹理、剪裁
- 微信小程序 canvas圆角矩形的绘制
- angularjs – PUT / GET与有效载荷使用矩形
- html5 – 画布中的矩形尺寸错误
- 如何判断一个点在旋转后的矩形中
- .net – 如何为WPF元素提供矩形平面3D边框?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。