我运行app,然后在图像上按鼠标左键。它应该从代码中得出点:
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, brushTextura);
glPointSize(100);
glVertexPointer(2, GL_FLOAT, 0,GLVertices);
glDrawArrays(GL_POINTS, 0, count);
glDisableClientState(GL_VERTEX_ARRAY);
在我按下的位置。 mouseDown
注册mouseDown位置,将其转换为NSValue,发送到数组,然后在绘制之前我将NSValue提取到CGPoint并将其发送到GLfloat,以便glDrawArrays可以绘制它。但无论我在图像上单击鼠标,它都会在坐标(0,0)处绘制点。之后,每件事情都可以。见图:
这是第一个问题。第二个问题是当我用它绘画时(拖动按下的鼠标),有时会出现点未绘制的位置。图像:
当我继续拖动时,它会消失。拖动后再次出现并再次消失。等等。图像:
任何想法为什么会发生?我将发布以下代码:
鼠标按下:
- (void) mouseDown:(NSEvent *)event
{
location = [self convertPoint: [event locationInWindow] fromView:self];
NSValue *locationValue = [NSValue valueWithPoint:location];
[vertices addObject:locationValue];
[self drawing];
}
拖动鼠标:
- (void) mouseDragged:(NSEvent *)event
{
location = [self convertPoint: [event locationInWindow] fromView:self];
NSValue *locationValue = [NSValue valueWithPoint:location];
[vertices addObject:locationValue];
[self drawing];
}
图:
- (void) drawing {
int count = [vertices count] * 2;
NSLog(@"count: %d", count);
int currIndex = 0;
GLfloat *GLVertices = (GLfloat *)malloc(count * sizeof(GLfloat));
for (NSValue *locationValue in vertices) {
CGPoint loc = locationValue.pointValue;
GLVertices[currIndex++] = loc.x;
GLVertices[currIndex++] = loc.y;
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, brushTextura);
glPointSize(100);
glVertexPointer(2, GL_FLOAT, 0, GLVertices);
glDrawArrays(GL_POINTS, 0, count);
glDisableClientState(GL_VERTEX_ARRAY);
}
答案 0 :(得分:6)
您正在将count
变量(glDrawArrays
中使用的变量)设置为[vertices count] * 2
,这看起来很奇怪。
glDrawArrays
的最后一个参数是要绘制的顶点数,而在你的代码中你似乎将它设置为数字的两倍(也许你认为它是浮点数?),这意味着你是只是在第一个count
顶点之后绘制垃圾。
答案 1 :(得分:1)
顶点未在您单击的确切位置渲染的事实应该是一个提示,问题是您没有正确确定视图中的生命点。
您的代码有:
location = [self convertPoint: [event locationInWindow] fromView: self];
告诉视图将点从其坐标(self)转换为相同视图的坐标(self),即使该点实际上是相对于窗口。
要将点从窗口坐标转换为视图,请将该行更改为以下内容:
location = [self convertPoint: [event locationInWindow] fromView: nil];
答案 2 :(得分:0)
glDrawArrays的参数定义为(GLenum模式,GLint优先,GLsizei计数)。
第二个参数定义绘制时使用的顶点属性的第一个索引。您传递1作为第一个使顶点坐标不匹配的索引。我假设你想要0。