 |
forums.ps2dev.org Homebrew PS2, PSP & PS3 Development Discussions
|
| View previous topic :: View next topic |
| Author |
Message |
LuMo
Joined: 21 Aug 2005 Posts: 410 Location: Austria
|
Posted: Wed Feb 01, 2006 11:57 pm Post subject: textures & normals |
|
|
hi,
i am still working on my meshloader and currently i am trying to get textures on the meshes;
the structure i am using for a textured vertex is:
| Code: | class Vertex3dbV4
{
public:
float u, v; // UV-texture
unsigned int color; // AABBGGRR
float nx, ny, nz; // normals
float x, y, z;
}; |
so when i am drawing the model i pass the following line:
| Code: | sceGumDrawArray(GU_TRIANGLES,
GU_INDEX_16BIT | GU_TEXTURE_32BITF | GU_NORMAL_32BITF | GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_3D,
(int)mesh.faceCount * 3,
mesh.faces,
mesh.verticesV4); |
note: i also tried to swap to
GU_INDEX_16BIT | GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_NORMAL_32BITF |GU_VERTEX_32BITF | GU_TRANSFORM_3D
with the absolute same effect...
its still flat!
the normals are calculated correct, as i am using it in non-textured mode, which works out nice!
any ideas?
greets
lumo _________________ "Good artists copy, great artists steal."
Pablo Picasso
go2lumo.com |
|
| Back to top |
|
 |
jsgf
Joined: 12 Jul 2005 Posts: 254
|
Posted: Thu Feb 02, 2006 8:59 am Post subject: |
|
|
You're not calling | Code: | | sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGB); | ? Without that, the vertex colours computed by lighting will have no effect on the texture. Also, you probably don't need per-vertex colours, since you're using lighting. |
|
| Back to top |
|
 |
TheBrooster
Joined: 01 Jun 2005 Posts: 16
|
Posted: Thu Feb 02, 2006 9:36 am Post subject: |
|
|
On a similar note. I am trying to modify the cube demo to use a 32 bpp tga, with alpha. The tga loads and renders, but the transparent portions are completely opaque, any ideas?
Here is the setup code
| Code: | void
InitDisplay(void)
{
pspDebugScreenInit();
setupCallbacks();
// setup GU
void* fbp0 = getStaticVramBuffer(BUF_WIDTH,SCR_HEIGHT,GU_PSM_8888);
void* fbp1 = getStaticVramBuffer(BUF_WIDTH,SCR_HEIGHT,GU_PSM_8888);
void* zbp = getStaticVramBuffer(BUF_WIDTH,SCR_HEIGHT,GU_PSM_4444);
sceGuInit();
sceGuStart(GU_DIRECT,list);
sceGuDrawBuffer(GU_PSM_8888,fbp0,BUF_WIDTH);
sceGuDispBuffer(SCR_WIDTH,SCR_HEIGHT,fbp1,BUF_WIDTH);
sceGuDepthBuffer(zbp,BUF_WIDTH);
sceGuOffset(2048 - (SCR_WIDTH/2),2048 - (SCR_HEIGHT/2));
sceGuViewport(2048,2048,SCR_WIDTH,SCR_HEIGHT);
sceGuDepthRange(65535,0);
sceGuScissor(0,0,SCR_WIDTH,SCR_HEIGHT);
sceGuEnable(GU_SCISSOR_TEST);
sceGuFrontFace(GU_CW);
sceGuShadeModel(GU_SMOOTH);
sceGuDepthFunc(GU_GEQUAL);
sceGuEnable(GU_DEPTH_TEST);
sceGuEnable(GU_CULL_FACE);
sceGuEnable(GU_TEXTURE_2D);
sceGuEnable(GU_CLIP_PLANES);
//sceGuAlphaFunc(GU_GREATER, 0, 0xff);
//sceGuEnable(GU_ALPHA_TEST);
// enable alpha channel
sceGuEnable(GU_BLEND);
sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
// setup projection matrix
sceGumMatrixMode(GU_PROJECTION);
sceGumLoadIdentity();
sceGumPerspective(75.0f,16.0f/9.0f,0.5f,1000.0f);
// setup view matrix
sceGumMatrixMode(GU_VIEW);
sceGumLoadIdentity();
// setup model matrix
sceGumMatrixMode(GU_MODEL);
sceGumLoadIdentity();
sceGuAmbientColor(0xffffffff);
sceGuFinish();
sceGuSync(0,0);
sceDisplayWaitVblankStart();
sceGuDisplay(GU_TRUE);
} |
and my render code:
| Code: | void
CRenderer::Render(void)
{
if ( !pImage )
pImage = g_TextureMan.LoadTGA( "Octane.tga");
if ( !pImage )
return;
static float val = 0.f;
sceGumMatrixMode(GU_MODEL);
sceGumLoadIdentity();
{
ScePspFVector3 pos = { 0, 0, -2.5f };
ScePspFVector3 rot = { val * 0.79f * (GU_PI/180.0f), val * 0.98f * (GU_PI/180.0f), val * 1.32f * (GU_PI/180.0f) };
sceGumTranslate(&pos);
sceGumRotateXYZ(&rot);
}
// setup texture
sceGuTexMode( pImage->GetFormat(), pImage->GetNumMipmaps(), 0, pImage->IsSwizzled() );
sceGuTexImage( 0, pImage->GetWidth(), pImage->GetHeight(), pImage->GetWidth(), pImage->GetImageData() );
sceGuTexFunc(GU_TFX_BLEND, GU_TCC_RGBA);
sceGuTexEnvColor(0x00000000);
sceGuTexFilter(GU_LINEAR,GU_LINEAR);
sceGuTexScale(1.0f,1.0f);
sceGuTexOffset(0.0f,0.0f);
// draw test case
sceGumDrawArray(GU_TRIANGLES,GU_TEXTURE_32BITF|GU_COLOR_8888|GU_VERTEX_32BITF|GU_TRANSFORM_3D,12*3,0,vertices);
val += 0.25f;
}
|
|
|
| Back to top |
|
 |
LuMo
Joined: 21 Aug 2005 Posts: 410 Location: Austria
|
Posted: Thu Feb 02, 2006 7:20 pm Post subject: |
|
|
| jsgf wrote: | You're not calling | Code: | | sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGB); | ? Without that, the vertex colours computed by lighting will have no effect on the texture. Also, you probably don't need per-vertex colours, since you're using lighting. |
if i am using modulate the cube is black! (no more textures)
further, by using
GU_TFX_ADD - The texture is added on-top of the diffuse fragment
should do similar (and textures)
still no shading.
@thebrooster
try adding:
greets lumo | Code: | | sceGuTexFunc (GU_TFX_ADD,GU_TCC_RGBA); |
should fix your problem _________________ "Good artists copy, great artists steal."
Pablo Picasso
go2lumo.com |
|
| Back to top |
|
 |
LuMo
Joined: 21 Aug 2005 Posts: 410 Location: Austria
|
Posted: Thu Feb 02, 2006 8:46 pm Post subject: |
|
|
this is my full texture setup:
| Code: | sceGuEnable(GU_TEXTURE_2D);
sceGuTexMode(GU_PSM_8888,0,0,0);
/* Set texture as current texture for the GU */
sceGuTexImage(0,width, height, width, texture);
sceGuTexFunc(GU_TFX_REPLACE,GU_TCC_RGBA); // adds to vertexpaint
sceGuTexEnvColor(0xffff00);
sceGuTexFilter(GU_LINEAR,GU_LINEAR);
sceGuTexScale(1.0f,1.0f);
sceGuTexOffset(0.0f,0.0f); |
and thats my gu setup: (above the texture setup...)
| Code: | // setup GU
sceGuInit();
sceGuStart(GU_DIRECT, list);
sceGuDrawBuffer(GU_PSM_8888, (void *)0, BUF_WIDTH);
sceGuDispBuffer(SCR_WIDTH, SCR_HEIGHT, (void *)0x88000, BUF_WIDTH);
sceGuDepthBuffer((void *)0x110000, BUF_WIDTH);
sceGuOffset(2048 - (SCR_WIDTH / 2), 2048 - (SCR_HEIGHT / 2));
sceGuViewport(2048, 2048, SCR_WIDTH, SCR_HEIGHT);
sceGuDepthRange(0xc350, 0x2710);
sceGuScissor(0, 0, SCR_WIDTH, SCR_HEIGHT);
sceGuEnable(GU_SCISSOR_TEST);
sceGuDepthFunc(GU_GEQUAL);
sceGuEnable(GU_DEPTH_TEST);
sceGuFrontFace(GU_CCW); //backfaceculling
sceGuShadeModel(GU_SMOOTH);
sceGuEnable(GU_CULL_FACE); //enable faceculling
sceGuEnable(GU_CLIP_PLANES);
//lightning
sceGuEnable(GU_LIGHTING);
sceGuEnable(GU_LIGHT0); |
greets lumo _________________ "Good artists copy, great artists steal."
Pablo Picasso
go2lumo.com |
|
| Back to top |
|
 |
LuMo
Joined: 21 Aug 2005 Posts: 410 Location: Austria
|
Posted: Thu Feb 02, 2006 9:04 pm Post subject: |
|
|
here a full sample of the modded version of the cube
note: normals are NOT correct, jzst random numbers, but that does not really matter, as at least something should be shaded...
its black using
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGB);
and its textured using
sceGuTexFunc(GU_TFX_ADD, GU_TCC_RGB);
if someone gets THIS code running with shading, my problems are solved too :)
| Code: | /*
* PSP Software Development Kit - http://www.pspdev.org
* -----------------------------------------------------------------------
* Licensed under the BSD license, see LICENSE in PSPSDK root for details.
*
* Copyright (c) 2005 Jesper Svennevid
*/
#include <pspkernel.h>
#include <pspdisplay.h>
#include <pspdebug.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <pspgu.h>
#include <pspgum.h>
PSP_MODULE_INFO("Cube Sample", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
#define printf pspDebugScreenPrintf
static unsigned int __attribute__((aligned(16))) list[262144];
extern unsigned char logo_start[];
struct Vertex
{
float u, v;
unsigned int color;
float nx, ny, nz; // normals
float x,y,z;
};
struct Vertex __attribute__((aligned(16))) vertices[12*3] =
{
{0, 0, 0,0,1, 0xff7f0000,-1,-1, 1}, // 0
{1, 0, 0,1,1, 0xff7f0000,-1, 1, 1}, // 4
{1, 1, 1,1,1, 0xff7f0000, 1, 1, 1}, // 5
{0, 0, 0,0,1, 0xff7f0000,-1,-1, 1}, // 0
{1, 1, 1,1,1, 0xff7f0000, 1, 1, 1}, // 5
{0, 1, 1,0,1, 0xff7f0000, 1,-1, 1}, // 1
{0, 0, 0,0,0, 0xff7f0000,-1,-1,-1}, // 3
{1, 0, 1,0,0, 0xff7f0000, 1,-1,-1}, // 2
{1, 1, 1,1,0, 0xff7f0000, 1, 1,-1}, // 6
{0, 0, 0,0,0, 0xff7f0000,-1,-1,-1}, // 3
{1, 1, 1,1,0, 0xff7f0000, 1, 1,-1}, // 6
{0, 1, 0,1,0, 0xff7f0000,-1, 1,-1}, // 7
{0, 0, 1,0,0, 0xff007f00, 1,-1,-1}, // 0
{1, 0, 1,0,1, 0xff007f00, 1,-1, 1}, // 3
{1, 1, 1,1,1, 0xff007f00, 1, 1, 1}, // 7
{0, 0, 1,0,0, 0xff007f00, 1,-1,-1}, // 0
{1, 1, 1,1,1, 0xff007f00, 1, 1, 1}, // 7
{0, 1, 1,1,0, 0xff007f00, 1, 1,-1}, // 4
{0, 0, 0,0,0, 0xff007f00,-1,-1,-1}, // 0
{1, 0, 0,1,0, 0xff007f00,-1, 1,-1}, // 3
{1, 1, 0,1,1, 0xff007f00,-1, 1, 1}, // 7
{0, 0, 0,0,0, 0xff007f00,-1,-1,-1}, // 0
{1, 1, 0,1,1, 0xff007f00,-1, 1, 1}, // 7
{0, 1, 0,0,1, 0xff007f00,-1,-1, 1}, // 4
{0, 0, 0,1,0, 0xff00007f,-1, 1,-1}, // 0
{1, 0, 1,1,0, 0xff00007f, 1, 1,-1}, // 1
{1, 1, 1,1,1, 0xff00007f, 1, 1, 1}, // 2
{0, 0, 0,1,0, 0xff00007f,-1, 1,-1}, // 0
{1, 1, 1,1,1, 0xff00007f, 1, 1, 1}, // 2
{0, 1, 0,1,1, 0xff00007f,-1, 1, 1}, // 3
{0, 0, 0,0,0, 0xff00007f,-1,-1,-1}, // 4
{1, 0, 0,0,1, 0xff00007f,-1,-1, 1}, // 7
{1, 1, 1,0,1, 0xff00007f, 1,-1, 1}, // 6
{0, 0, 0,0,0, 0xff00007f,-1,-1,-1}, // 4
{1, 1, 1,0,1, 0xff00007f, 1,-1, 1}, // 6
{0, 1, 1,0,0, 0xff00007f, 1,-1,-1}, // 5
};
int SetupCallbacks();
#define BUF_WIDTH (512)
#define SCR_WIDTH (480)
#define SCR_HEIGHT (272)
#define PIXEL_SIZE (4) /* change this if you change to another screenmode */
#define FRAME_SIZE (BUF_WIDTH * SCR_HEIGHT * PIXEL_SIZE)
#define ZBUF_SIZE (BUF_WIDTH SCR_HEIGHT * 2) /* zbuffer seems to be 16-bit? */
int main(int argc, char* argv[])
{
SetupCallbacks();
// setup GU
sceGuInit();
sceGuStart(GU_DIRECT,list);
sceGuDrawBuffer(GU_PSM_8888,(void*)0,BUF_WIDTH);
sceGuDispBuffer(SCR_WIDTH,SCR_HEIGHT,(void*)0x88000,BUF_WIDTH);
sceGuDepthBuffer((void*)0x110000,BUF_WIDTH);
sceGuOffset(2048 - (SCR_WIDTH/2),2048 - (SCR_HEIGHT/2));
sceGuViewport(2048,2048,SCR_WIDTH,SCR_HEIGHT);
sceGuDepthRange(0xc350,0x2710);
sceGuScissor(0,0,SCR_WIDTH,SCR_HEIGHT);
sceGuEnable(GU_SCISSOR_TEST);
sceGuDepthFunc(GU_GEQUAL);
sceGuEnable(GU_DEPTH_TEST);
sceGuFrontFace(GU_CW);
sceGuShadeModel(GU_SMOOTH);
sceGuEnable(GU_CULL_FACE);
sceGuEnable(GU_TEXTURE_2D);
sceGuEnable(GU_CLIP_PLANES);
sceGuFinish();
sceGuSync(0,0);
sceDisplayWaitVblankStart();
sceGuDisplay(GU_TRUE);
// run sample
int val = 0;
for(;;)
{
sceGuStart(GU_DIRECT,list);
// clear screen
sceGuClearColor(0xff554433);
sceGuClearDepth(0);
sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT);
// setup matrices for cube
sceGumMatrixMode(GU_PROJECTION);
sceGumLoadIdentity();
sceGumPerspective(75.0f,16.0f/9.0f,0.5f,1000.0f);
sceGumMatrixMode(GU_VIEW);
sceGumLoadIdentity();
sceGumMatrixMode(GU_MODEL);
sceGumLoadIdentity();
{
ScePspFVector3 pos = { 0, 0, -2.5f };
ScePspFVector3 rot = { val * 0.79f * (GU_PI/180.0f), val * 0.98f * (GU_PI/180.0f), val * 1.32f * (GU_PI/180.0f) };
sceGumTranslate(&pos);
sceGumRotateXYZ(&rot);
}
// setup texture
sceGuTexMode(GU_PSM_4444,0,0,0);
sceGuTexImage(0,64,64,64,logo_start);
//sceGuTexFunc(GU_TFX_ADD,GU_TCC_RGB);
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGB);
sceGuTexEnvColor(0xffff00);
sceGuTexFilter(GU_LINEAR,GU_LINEAR);
sceGuTexScale(1.0f,1.0f);
sceGuTexOffset(0.0f,0.0f);
sceGuAmbientColor(0xffffffff);
// draw cube
sceGumDrawArray(GU_TRIANGLES,GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_NORMAL_32BITF |GU_VERTEX_32BITF|GU_TRANSFORM_3D,12*3,0,vertices);
sceGuFinish();
sceGuSync(0,0);
sceDisplayWaitVblankStart();
sceGuSwapBuffers();
val++;
}
sceGuTerm();
sceKernelExitGame();
return 0;
}
/* Exit callback */
int exit_callback(int arg1, int arg2, void *common)
{
sceKernelExitGame();
return 0;
}
/* Callback thread */
int CallbackThread(SceSize args, void *argp)
{
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void)
{
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0)
{
sceKernelStartThread(thid, 0, 0);
}
return thid;
}
|
_________________ "Good artists copy, great artists steal."
Pablo Picasso
go2lumo.com |
|
| Back to top |
|
 |
TheBrooster
Joined: 01 Jun 2005 Posts: 16
|
Posted: Fri Feb 03, 2006 2:17 am Post subject: |
|
|
| Cheers Lumo, I will give it a go when I get home from work. |
|
| Back to top |
|
 |
LuMo
Joined: 21 Aug 2005 Posts: 410 Location: Austria
|
Posted: Fri Feb 03, 2006 2:24 am Post subject: |
|
|
ok i got it working
note: never use a white texture and white shading ;)
greets
lumo
PS: msg me if you need help _________________ "Good artists copy, great artists steal."
Pablo Picasso
go2lumo.com |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|