我工作的一个2D引擎。 它已经工作得很好,但我不断收到像素的错误。
例如,我的窗口是960×540个像素,我绘制从线(0,0)到(959,0)。 我预计在扫描线0每个像素将被设置为一种颜色,但没有:最右边的像素不绘制。 当我画垂直像素539.我真的需要提请同样的问题(960,0)或(0,540)将它绘制。
由于我出生在像素时代,我相信,这是不正确的结果。 当我的屏幕为320×200像素的大,我可以得出从0到319,并从0到199,和我的屏幕将是满的。 现在,我结束了与未绘制的右边/底部像素的屏幕。
这可能是由于不同的东西:在这里我想到了OpenGL线基本是从像素绘制包括一个像素,即最后一个像素只是实际上是排斥? 是不是这样? 我的投影矩阵是不正确的? 我是一个错误的假设,当我有960×540一个后备缓冲,也就是实际上有一个以上像素下? 别的东西?
有人可以帮帮我吗? 我一直在寻找这个问题很长一段时间,现在,每当我觉得还好的时候,我一会,它实际上并没有看到后。
下面是我的一些代码,我试图剥离下来,尽可能多地。 当我把我的线功能,每一个坐标与0.375,0.375加入使其正确的ATI和NVIDIA适配器。
int width = resX();
int height = resY();
for (int i = 0; i < height; i += 2)
rm->line(0, i, width - 1, i, vec4f(1, 0, 0, 1));
for (int i = 1; i < height; i += 2)
rm->line(0, i, width - 1, i, vec4f(0, 1, 0, 1));
// when I do this, one pixel to the right remains undrawn
void rendermachine::line(int x1, int y1, int x2, int y2, const vec4f &color)
{
... some code to decide what std::vector the coordinates should be pushed into
// m_z is a z-coordinate, I use z-buffering to preserve correct drawing orders
// vec2f(0, 0) is a texture-coordinate, the line is drawn without texturing
target->push_back(vertex(vec3f((float)x1 + 0.375f, (float)y1 + 0.375f, m_z), color, vec2f(0, 0)));
target->push_back(vertex(vec3f((float)x2 + 0.375f, (float)y2 + 0.375f, m_z), color, vec2f(0, 0)));
}
void rendermachine::update(...)
{
... render target object is queried for width and height, in my test it is just the back buffer so the window client resolution is returned
mat4f mP;
mP.setOrthographic(0, (float)width, (float)height, 0, 0, 8000000);
... all vertices are copied to video memory
... drawing
if (there are lines to draw)
glDrawArrays(GL_LINES, (int)offset, (int)lines.size());
...
}
// And the (very simple) shader to draw these lines
// Vertex shader
#version 120
attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
uniform mat4 mP;
varying vec4 vColor;
void main(void) {
gl_Position = mP * vec4(aVertexPosition, 1.0);
vColor = aVertexColor;
}
// Fragment shader
#version 120
#ifdef GL_ES
precision highp float;
#endif
varying vec4 vColor;
void main(void) {
gl_FragColor = vColor.rgb;
}