Problems with IBO - Citro 3d

Post Reply
antoniorand
Posts: 1
Joined: Tue Jul 26, 2022 12:31 pm

Problems with IBO - Citro 3d

Post by antoniorand » Fri Aug 26, 2022 2:11 pm

Hello, I'm editing the simple triangle to add support to the index buffer object (IBO).

This is my code but it doesn't draw anything, something must be wrong in a certain line but I'm not sure.

The only difference to the simple triangle code is that I added a new vertex and an indices list, furthermore it reserves more memory for the IBO and I call to DrawElements instead of DrawArrays, with what I think are the correct parameters. I don't think the shader matters but it is the same as the simple_tri example.

Code: Select all


static const vertex vertex_list[] =
{
	{ 200.0f, 200.0f, 0.5f }, //0
	{ 100.0f, 40.0f,  0.5f }, // 1
	{ 300.0f, 40.0f,  0.5f }, // 2
	{ 390.0f, 200.0f, 0.5f}  // 3
};

static const u16 indices_list[] = 
{
	0, 1, 2,   // first triangle
    0, 2, 3    // second triangle
};

#define vertex_list_count (sizeof(vertex_list)/sizeof(vertex_list[0]))
#define indices_list_count (sizeof(indices_list)/sizeof(indices_list[0]))



static void* vbo_data;
static void* ibo_data;	

static void sceneInit(void)
{
	// Load the vertex shader, create a shader program and bind it
	vshader_dvlb = DVLB_ParseFile((u32*)vshader_shbin, vshader_shbin_size);
	shaderProgramInit(&program);
	shaderProgramSetVsh(&program, &vshader_dvlb->DVLE[0]);
	C3D_BindProgram(&program);

	// Get the location of the uniforms
	uLoc_projection = shaderInstanceGetUniformLocation(program.vertexShader, "projection");

	// Configure attributes for use with the vertex shader
	C3D_AttrInfo* attrInfo = C3D_GetAttrInfo();
	AttrInfo_Init(attrInfo);
	AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position
	AttrInfo_AddFixed(attrInfo, 1); // v1=color

	// Set the fixed attribute (color) to solid white
	C3D_FixedAttribSet(1, 1.0, 1.0, 1.0, 1.0);

	// Compute the projection matrix
	Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true);

	// Create the VBO (vertex buffer object)
	vbo_data = linearAlloc(sizeof(vertex_list));
	memcpy(vbo_data, vertex_list, sizeof(vertex_list));
	// Create the IBO (index buffer object)
	ibo_data = linearAlloc(sizeof(indices_list));
	memcpy(ibo_data,indices_list,sizeof(indices_list));

	// Configure buffers
	C3D_BufInfo* bufInfo = C3D_GetBufInfo();
	BufInfo_Init(bufInfo);
	BufInfo_Add(bufInfo, vbo_data, sizeof(vertex), 1, 0x0);

	// Configure the first fragment shading substage to just pass through the vertex color
	// See https://www.opengl.org/sdk/docs/man2/xhtml/glTexEnv.xml for more insight
	C3D_TexEnv* env = C3D_GetTexEnv(0);
	C3D_TexEnvInit(env);
	C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR, 0, 0);
	C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE);
}

static void sceneRender(void)
{
	// Update the uniforms
	C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection);

	// Draw the VBO
	//C3D_DrawArrays(GPU_TRIANGLES, 0, vertex_list_count);
	C3D_DrawElements(GPU_TRIANGLES, 
		indices_list_count, C3D_UNSIGNED_SHORT, indices_list);
}


User avatar
fincs
( ͡° ͜ʖ ͡°)
Posts: 92
Joined: Mon Jul 12, 2010 9:45 pm
Location: Seville, Spain
Contact:

Re: Problems with IBO - Citro 3d

Post by fincs » Sat Aug 27, 2022 12:56 pm

You correctly copied your indices_list to a new buffer in linear memory, but then forgot to actually use it in C3D_DrawElements.
Donate to devkitPro - help us stay alive!

Post Reply

Who is online

Users browsing this forum: No registered users and 2 guests