【发布时间】:2014-12-30 11:26:55
【问题描述】:
我试图通过逐个像素地绘制图像来渲染图像(是的,我知道这不是最有效的,但它更多地用于学习目的)并且我遇到了一个奇怪的问题,它会像这样绘制白线:@987654321 @
我使用 glut 和 Visual Studio 2013。这是我的glutinit:
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA); // Double buffering, RGB format
glutInitWindowSize(width, heigth);
glutInitWindowPosition(0, 0);
glutCreateWindow("Test Plaatje");
glClearColor(1.0, 1.0, 1.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 1024, 0.0, 500);
glMatrixMode(GL_MODELVIEW);
这是我的渲染代码,其中解释了一些变量:
...
std::vector<std::vector<RGB>> _map = std::vector<std::vector<RGB>>();
...
struct RGB
{
int R;
int G;
int B;
};
...
void Map::draw()
{
glBegin(GL_POINTS);
for (float x = 0; x < _w; x++)
{
for (float y = 0; y < _h; y++)
{
RGB pixel = _map[y][x];
glColor3ub(pixel.R, pixel.G, pixel.B);
glVertex2f(_p[0] + x, _p[1] + y);
}
}
glEnd();
}
我已经尝试用一些十进制值移动像素,但没有奏效。我通过将像素值转储到文件来验证_map 是正确的。作为参考,这是它应该呈现的内容:
我不知道如何解决这个问题。有人有什么想法吗?
【问题讨论】:
-
试试这个:
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);你可能想事先启用混合:glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_POINT_SMOOTH);但我不确定哪些是必要的,哪些不是。也尝试增加点大小glPointSize(2.0)。 -
@n.m.我使用了 glEnable(GL_BLEND); glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);它奏效了!谢谢!
-
假设您的窗口和图像都是 1024x500 像素(并且模型视图矩阵留在标识处),如果
_p[0]和_p[1]设置为 0.5,您的代码应该可以工作,而不必使用GL_POINT_SMOOTH. -
@derhass 是的,但这因配置而异。 p 确保窗口中有一个顶部和侧边栏。
-
@user2988415:你能详细说明一下吗?问题是,您设置了投影矩阵,使像素中心位于“.5”,并且像素边界恰好位于整数处。理想情况下,您应该始终在像素中心绘制点。但是,无论您在
_p和模型视图矩阵中输入什么内容,都会对此产生影响。
标签: c++ opengl visual-c++ freeglut