gpt4 book ai didi

xcode4.2 - 为什么我的 OpenGL ES 2.0 程序只绘制一条线而不是一组线? (GLKit 或 OpenGL)

转载 作者:行者123 更新时间:2023-12-01 08:06:48 26 4
gpt4 key购买 nike

好吧,我已经检查了一遍又一遍,到目前为止,我“认为”我了解 opengl 是如何绘制的以及如何指定我想要绘制的内容,但是我似乎无法让它绘制超过 1 条线。

使用 Xcode 4.2 中的模板,我可以获得以下代码。它确实使用 GLKIT 绘制我的方形骨架,因为我只是忽略了 opengl es 2.0 方法不使用着色器 atm,但是当我触摸屏幕时它应该绘制我自己的数组,但它没有....

所以首先是方形格式(只是为了显示他们在模板中使用的变量类型)

GLfloat gCubeVertexData[216] = 
{
// Data layout for each line below is:
// positionX, positionY, positionZ, normalX, normalY, normalZ,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,

0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,

-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,

-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,

0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,

0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f
};

这是我在“View did Load”函数中调用 Once 的 SetupGL。

- (void)setupGL
{
[EAGLContext setCurrentContext:self.context];

[self loadShaders];

self.effect = [[GLKBaseEffect alloc] init];
self.effect.light0.enabled = GL_TRUE; //No Idea why it wont work without this


glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));

glBindVertexArrayOES(0);
}

这是更新方法(就是让东西旋转)

- (void)update
{
float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 10000.0f);

self.effect.transform.projectionMatrix = projectionMatrix;

GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -10.0f);
baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f);

// Compute the model view matrix for the object rendered with GLKit
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f);
modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);

self.effect.transform.modelviewMatrix = modelViewMatrix;

_rotation += self.timeSinceLastUpdate * 0.5f;
}

Draw In Rect 方法(我认为的渲染)

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBindVertexArrayOES(_vertexArray);

// Render the object with GLKit
[self.effect prepareToDraw];

glDrawArrays(GL_LINE_STRIP, 0, 36); //Probably have to change the 36

}

这是触摸部分:

关于触摸开始,我只是在创建 NSMutableData

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
UITouch *touch = [touches anyObject];
startPoint = [touch locationInView:self.view];

vertexData3 = [NSMutableData dataWithLength: sizeof(GLKVector2)]; //HERE

if (!referenceAttitude)
referenceAttitude = motionManager.deviceMotion.attitude;

writtingON = YES;

}

在 Touches Ended 上,我正在尝试使用我获得的新顶点进行绘制。顶点是使用触发来自运动管理器的读数的计时器获得的,进行一些数学运算 + 用户触摸屏幕的位置,因此值应该在屏幕坐标的范围内。

但是为了测试绘图,我只是创建了一个时间 NSMUtableData 变量,其中包含我手动添加的一些值(添加是可怕的)。我正在使用 NSMutableData,因为那是他们在另一个教程中建议的。我 90% 确定它正在正确保存数据,因为当我检索它时它就在那里。 ( http://games.ianterrell.com/how-to-draw-2d-shapes-with-glkit/ )

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{


////////Test array


tempVert = GLKVector2Make(10, -8);
NSRange r = {0*sizeof(GLKVector2), sizeof(GLKVector2)};
[vertexData3 replaceBytesInRange: r withBytes:&tempVert];
[vertexData3 increaseLengthBy:sizeof(GLKVector2)];

tempVert = GLKVector2Make(2, -8);
NSRange q = {1*sizeof(GLKVector2), sizeof(GLKVector2)};
[vertexData3 replaceBytesInRange: q withBytes:&tempVert];
[vertexData3 increaseLengthBy:sizeof(GLKVector2)];

tempVert = GLKVector2Make(4, 9);
NSRange w = {2*sizeof(GLKVector2), sizeof(GLKVector2)};
[vertexData3 replaceBytesInRange: w withBytes:&tempVert];
[vertexData3 increaseLengthBy:sizeof(GLKVector2)];

tempVert = GLKVector2Make(1, -9);
NSRange e = {3*sizeof(GLKVector2), sizeof(GLKVector2)};
[vertexData3 replaceBytesInRange: e withBytes:&tempVert];
[vertexData3 increaseLengthBy:sizeof(GLKVector2)];

tempVert = GLKVector2Make(2, -2);
NSRange t = {4*sizeof(GLKVector2), sizeof(GLKVector2)};
[vertexData3 replaceBytesInRange: t withBytes:&tempVert];
[vertexData3 increaseLengthBy:sizeof(GLKVector2)];


//////////////////////

glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);

glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData3), [vertexData3 mutableBytes], GL_DYNAMIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

glBindVertexArrayOES(0);

}

最后一部分让我发疯!!!我认为它应该做的是,用我自己的数组修改缓冲区,以便自动更新绘制它。

任何建议将不胜感激。

谢谢

哦,如果有人知道如何设置正交矩阵,因为我真的只对 atm 的二维分量感兴趣,所以我不能用它替换那个透视矩阵。

编辑:

好吧,我只是尝试发送一个随机的 GLfloats 数组,它确实改变了形状,但为什么不使用我的 NSMutableData 数组呢?我以为我正在做与教程中完全相同的程序....

最佳答案

最后一部分应该只有:

glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData3), [vertexData3 mutableBytes], GL_DYNAMIC_DRAW);
// bind buffer and specify it's new data (no need to glGenBuffers(), that was done in setupGL())
// also, it would be handy to save number of vertices so it could be used later for drawing (nVertices = sizeof(vertexData3) / sizeof(GLKVector2))

glBindVertexArrayOES(_vertexArray);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glBindVertexArrayOES(0);
// bind vertex array and setup the vertex attribute (although this could be done only once, in setupGL())

这样一来,您就不会生成那么多 OpenGL 对象,渲染速度应该会更快(而且不会耗尽内存)。

否则,渲染似乎没问题。但是你真的应该使用真正的顶点数来绘制:

glDrawArrays(GL_LINE_STRIP, 0, nVertices);

几乎肯定存在比例问题(GLfloats 和 GLKVector2 之间应该没有区别)。你用你的方法生成了一些点,但只画了前 36 个。可能有一条曲线生成正确,但你只看到它开始的一小部分,自然看起来很平坦。此外,您似乎不确定您的位置计算是否会在窗口内生成坐标,也许最好 a) 在此处发布您的源代码 b) 将您的坐标乘以一些小的(但大于零)值以便它们适合屏幕。

至于正交,你可以使用:

GLKMatrix4MakeOrtho(-1, 1, -1, 1, .1, 1000); // this sets normalized coordinates
GLKMatrix4MakeOrtho(0, widthPx, 0, heightPx, .1, 1000); // this sets pixel coordinates

GLKMatrix4MakeOrtho 的参数只是屏幕角点(左、右、下、上)的所需坐标和绘制的深度范围(近、远)。

我希望这至少能给你一些洞察力......

关于xcode4.2 - 为什么我的 OpenGL ES 2.0 程序只绘制一条线而不是一组线? (GLKit 或 OpenGL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com