gpt4 book ai didi

objective-c - 指针和opengl绘图的问题

转载 作者:太空宇宙 更新时间:2023-11-04 00:09:29 25 4
gpt4 key购买 nike

我正在尝试实现一个简单的渲染管理器。另一个类提供了一个表示四边形的结构,并将其复制到渲染管理器中的顶点数组缓冲区中。

但是复制似乎不起作用,当我手动创建一个结构并将其复制到顶点数组时,一切都很好并且可以呈现。但是在副本的某个地方,一切都出错了。我可以使用 gdb 看到这一点(值不同),但我无法弄清楚发生了什么。

RenderManager 方法

-(id)init
{
if([super init]){
iva = calloc(MAX_QUADS, sizeof(quad));

quad draw = {
0.0f,0.0f,0.0f, 0.0f,0.0f,1.0f, //Bottom left
1.0f,0.0f,0.0f, 0.0f,0.0f,1.0f, //Top Left
1.0f,1.0f,0.0f, 0.0f,0.0f,1.0f, //Top Right
0.0f,1.0f,0.0f, 0.0f,0.0f,1.0f, //Bottom Right

0.5f,0.5f,0.0f, 0.0f,0.0f,1.0f, //Center
};

如果我将其注释掉,则没有任何内容。使用它,我得到了我期待的漂亮四边形

        memcpy(iva, &draw, sizeof(draw)); 
. . . OpenGl methods

//Add the quad details to the render queue
-(void)addDetailsToRenderQueue:(quad *)details
{
if(iva == NULL)
NSLog(@"Error claiming memory, something is very wrong");

if(renderCount + 1 > MAX_QUADS){
NSLog(@"Render buffer full, dumping...");
[self render];
}

memcpy((quad *)iva + renderCount++, &details, sizeof(quad));
}

//Render the details in the render queue, for each quad we need to make two triangles.
-(void)render
{
int counter = 0;

renderCount *= 5;

for(int i;i < renderCount;){
ivaIndices[counter++] = i + 0; // Bottom left
ivaIndices[counter++] = i + 1; //Top Left
ivaIndices[counter++] = i + 4; //Center

ivaIndices[counter++] = i + 1; //Top Left
ivaIndices[counter++] = i + 2; //Top right
ivaIndices[counter++] = i + 4; //Center

ivaIndices[counter++] = i + 2; //Top right
ivaIndices[counter++] = i + 3; //Bottom right
ivaIndices[counter++] = i + 4; //Center

ivaIndices[counter++] = i + 3; //Bottom right
ivaIndices[counter++] = i + 0; //Bottom Left
ivaIndices[counter++] = i + 4; //Center

i += 5;
}
glBindVertexArrayOES(_vertexArray);

glDrawElements(GL_LINE_STRIP,12, GL_UNSIGNED_SHORT, ivaIndices);

// Reset the number of quads which need to be rendered
renderCount = 0;
}

图 block 管理器方法

@interface TileSet : NSObject
{
quad *tiles;
NSUInteger tileCount;

RenderManager *sharedRenderManager;
}

-(id)init
{
if([super init]){
tiles = calloc(MAX_HEIGHT * MAX_WIDTH, sizeof(quad));
tileCount = 0;

sharedRenderManager = [RenderManager sharedManager];
}
[self fillArray];
return self;
}

-(void)fillArray
{
int rows = 4;
int columns = 12;

for(int i = 0; i < rows;i += 2) {
for(int j = 0;j < columns;j += 2) {
quad tmp;

tmp.v1.x = i;
tmp.v1.y = j;
tmp.v1.z = 0.0f;
tmp.v1.nx = 0.0f;
tmp.v1.ny = 0.0f;
tmp.v1.nz = 1.0f;

tmp.v2.x = i + 1;
tmp.v2.y = j;
tmp.v2.z = 0.0f;
tmp.v2.nx = 0.0f;
tmp.v2.ny = 0.0f;
tmp.v2.nz = 1.0f;

tmp.v3.x = i;
tmp.v3.y = j+1;
tmp.v3.z = 0.0f;
tmp.v3.nx = 0.0f;
tmp.v3.ny = 0.0f;
tmp.v3.nz = 1.0f;

tmp.v4.x = i + 1;
tmp.v4.y = j+1;
tmp.v4.z = 0.0f;
tmp.v4.nx = 0.0f;
tmp.v4.ny = 0.0f;
tmp.v4.nz = 1.0f;

tmp.v5.x = i + 0.5;
tmp.v5.y = j + 0.5;
tmp.v5.z = 0.0f;
tmp.v5.nx = 0.0f;
tmp.v5.ny = 0.0f;
tmp.v5.nz = 1.0f;

memcpy((quad *)tiles + (i*j + j), &tmp, sizeof(quad));
tileCount++;
}
}
}

//Draw the tiles in the tileset, loop through and add to renderManagers queue
-(void)render
{
for(int i = 0; i < tileCount;i++)
[sharedRenderManager addDetailsToRenderQueue:&tiles[0]];

}

编辑在回答问题时,添加

NSLog(@"Tiles:%x\tDisgusting pointer math:%x",tiles,(quad *)tiles + (i*j + j));

给出结果

2011-10-21 21:29:21.456 TerrainRendering[11293:fb03] Tiles:7316200  Disgusting pointer math:7316200
2011-10-21 21:29:21.458 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73162f0
2011-10-21 21:29:21.463 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73163e0
2011-10-21 21:29:21.464 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73164d0
2011-10-21 21:29:21.465 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73165c0
2011-10-21 21:29:21.465 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:7316200
2011-10-21 21:29:21.466 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73164d0
2011-10-21 21:29:21.467 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:73167a0
2011-10-21 21:29:21.470 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:7316a70
2011-10-21 21:29:21.470 TerrainRendering[11293:fb03] Tiles:7316200 Disgusting pointer math:7316d40

最佳答案

您在 memcpy 中的偏移量应为 (i*MAX_HEIGHT + j)。您想要使用“i”(外循环)跳转行并使用“j”(内循环)依次深入研究它们。

希望对你有帮助

关于objective-c - 指针和opengl绘图的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854284/

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