gpt4 book ai didi

iphone - glDrawArrays 上的 OpenGL ES EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-03 18:32:39 26 4
gpt4 key购买 nike

我在 OpenGL ES 1.1 中为我正在构建的 iPhone 游戏进行渲染时遇到问题。

简而言之,我正在渲染 3 项:

  1. 背景(效果很好)
  2. 一些球形物体(效果很好)
  3. 一个可以改变大小的简单线圆(我在这里遇到问题)。

基本上,当我在圆上调用drawArrays时,我收到了EXC_BAD_ACCESS错误。我已经在基本 iPhone OpenGL 模板中测试了代码,它工作得很好,所以我无法真正跟踪为什么它在这里不起作用。有人能指出我正确的方法吗?

这是用于渲染圆的drawCircle代码。

- (void) drawCircles
{
if (!m_circleEffects.empty())
{
int segments = 24;
for (int i = 0; i < m_circleEffects.size(); i++)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(m_circleEffects[i].position.x, m_circleEffects[i].position.y, 0);

float radius;
if(m_circleEffects[i].isPulseOutward)
radius = cos(m_circleEffects[i].frameCounter * M_PI / 720);
else
radius = sin(m_circleEffects[i].frameCounter * M_PI / 720);

GLfloat circlePoints[segments * 3];
int count = 0;

for (GLfloat i = 0; i < 360.0f; i += (360.0f / segments))
{
circlePoints[count++] = (cos(i * M_PI / 180) * radius);
circlePoints[count++] = (sin(i * M_PI / 180) * radius);
circlePoints[count++] = z + 1;
}

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, circlePoints);
glDrawArrays(GL_LINE_LOOP, 0, segments);
glDisableClientState(GL_VERTEX_ARRAY);
}
m_circleEffects.clear();
}
}

以下是我的其他渲染代码。它在运行循环中的上述代码之前被调用。下面的一切似乎都工作正常。

- (void)passInVisualsToUse:(vector<Visual>)visuals
{
frameCounter += 0.2;
if (frameCounter >= 360)
frameCounter -= 360;

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);

glDepthMask(GL_FALSE);

glBindTexture(GL_TEXTURE_2D, m_backgroundTexture);

glDrawTexfOES(0, 0, 0, 480, 320);
glDepthMask(GL_TRUE);

vector<Visual>::const_iterator visual = visuals.begin();
for (int visualIndex = 0;
visual != visuals.end();
++visual, ++visualIndex)
{

if (visual->ObjectType == 1)
glBindTexture(GL_TEXTURE_2D, m_oneTexture);
else if (visual->ObjectType == 2)
glBindTexture(GL_TEXTURE_2D, m_twoTexture);
else if (visual->ObjectType == 3)
glBindTexture(GL_TEXTURE_2D, m_threeTexture);
else
glBindTexture(GL_TEXTURE_2D, m_fourTexture);

// Set the viewport transform.
vec3 position = visual->Position;

// Set the light position.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(position.x, position.y, position.z);
float rotationAngle = visual->RotationAngle;
glRotatef(rotationAngle, 0, 1, 0);

float scale = visual->Scale;

if (visual->ShouldThrob)
{
float scaleFactor = scale + sin(frameCounter) / 25;
glScalef(scaleFactor, scaleFactor, scale);

BOOL isPulseOutward;
if (visual->isPulseOutward)
isPulseOutward = YES;
else
isPulseOutward = NO;

CircleEffect toAdd;
toAdd.position = position;
toAdd.frameCounter = frameCounter;
toAdd.isPulseOutward = isPulseOutward;
m_circleEffects.push_back(toAdd);
}
else
glScalef(scale, scale, scale);

// Set the projection transform.
float h = (float)screenSize.size.height / (float)screenSize.size.width;

mat4 projection = mat4::Ortho(xleft, xright, h * xleft, h * xright, znear, zfar);

glMatrixMode(GL_PROJECTION);
glLoadMatrixf(projection.Pointer());

// Draw the surface.
int stride = sizeof(vec3) + sizeof(vec3) + sizeof(vec2);
const GLvoid* texCoordOffset = (const GLvoid*) (2 * sizeof(vec3));
const Drawable& drawable = m_drawables[visualIndex];
glBindBuffer(GL_ARRAY_BUFFER, drawable.VertexBuffer);
glVertexPointer(3, GL_FLOAT, stride, 0);
const GLvoid* normalOffset = (const GLvoid*) sizeof(vec3);
glNormalPointer(GL_FLOAT, stride, normalOffset);
glTexCoordPointer(2, GL_FLOAT, stride, texCoordOffset);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, drawable.IndexBuffer);
glDrawElements(GL_TRIANGLES, drawable.IndexCount, GL_UNSIGNED_SHORT, 0);
}


glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
}

相关缓冲区已在其他地方设置,并且如上所述,第二个代码一切正常。

基本上,我在顶部代码片段中的drawArrays代码上得到了EXC_BAD_ACCESS。有人知道为什么吗?

谢谢

最佳答案

我的猜测是 GL 状态仍然有一个不应该绑定(bind)的数组。

如果它本身有效,那么该方法可能没问题。但是以前的方法可能没有将状态返回到应有的状态或其他东西。

关于iphone - glDrawArrays 上的 OpenGL ES EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6150441/

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