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);
}