diff --git a/source/main.cpp b/source/main.cpp index 2f952df..12e3378 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -13,9 +13,6 @@ GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO); constexpr u32 FRAMEBUFFER_TRANSFER_FLAGS = GX_TRANSFER_RAW_COPY(1); -constexpr u32 PREV_FRAME_CLEAR_DATA_SIZE = 240 * 400 * 4; -u32 PREV_FRAME_CLEAR_DATA[PREV_FRAME_CLEAR_DATA_SIZE]; - struct vertex { float st[2]; @@ -62,8 +59,9 @@ static DVLB_s* vshaderDVLB; static shaderProgram_s program; static s8 spheresUniformLocation; static s8 sphereColorsUniformLocation; +static s8 randLocation; -static constexpr unsigned int VERTEX_COUNT_W = 90; +static constexpr unsigned int VERTEX_COUNT_W = 150; static constexpr unsigned int VERTEX_COUNT_H = 10 * VERTEX_COUNT_W / 6; static constexpr unsigned int VERTEX_COUNT = VERTEX_COUNT_W * VERTEX_COUNT_H; @@ -89,6 +87,22 @@ static float rand01() return static_cast(rand()) / RAND_MAX; } +static C3D_FVec randvec() +{ + C3D_FVec out; + out.w = rand01(); + + do + { + out.x = rand01() * 2 - 1; + out.y = rand01() * 2 - 1; + out.z = rand01() * 2 - 1; + } + while (FVec3_Magnitude(out) > 1.0f); + + return out; +} + static void setupVertices() { for (unsigned int x = 0; x < VERTEX_COUNT_W; x++) @@ -114,15 +128,17 @@ static void setupVertices() } memcpy(vboData, vertexList, sizeof(vertexList)); + + constexpr int NUM_RAND = 4; + C3D_FVec* randPtr = C3D_FVUnifWritePtr(GPU_VERTEX_SHADER, randLocation, NUM_RAND); + for (int i = 0; i < NUM_RAND; i++) + { + randPtr[i] = randvec(); + } } static void sceneInit() { - for (unsigned int i = 0; i < PREV_FRAME_CLEAR_DATA_SIZE; i++) - { - PREV_FRAME_CLEAR_DATA[i] = 0xFFFFFFFF; - } - vboData = linearAlloc(sizeof(vertexList)); unsigned int v = 0; @@ -146,6 +162,7 @@ static void sceneInit() spheresUniformLocation = shaderInstanceGetUniformLocation(program.vertexShader, "spheres"); sphereColorsUniformLocation = shaderInstanceGetUniformLocation(program.vertexShader, "sphereColors"); + randLocation = shaderInstanceGetUniformLocation(program.vertexShader, "rand"); C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); AttrInfo_Init(attrInfo); @@ -173,13 +190,13 @@ static void sceneInit() constexpr u16 NUM_SPHERES = 3; C3D_FVec* spheres = C3D_FVUnifWritePtr(GPU_VERTEX_SHADER, spheresUniformLocation, NUM_SPHERES); spheres[0] = FVec4_New(0.0f, -100.5f, -1.0f, 100.0f); - spheres[1] = FVec4_New(0.5f, 0.0f, -1.0f, 0.5f); - spheres[2] = FVec4_New(-0.5f, 0.0f, -1.0f, 0.5f); + spheres[1] = FVec4_New(0.6f, 0.0f, -1.0f, 0.5f); + spheres[2] = FVec4_New(-0.6f, 0.0f, -1.0f, 0.5f); C3D_FVec* sphereColors = C3D_FVUnifWritePtr(GPU_VERTEX_SHADER, sphereColorsUniformLocation, NUM_SPHERES); - sphereColors[0] = FVec3_New(0.7f, 0.3f, 0.3f); - sphereColors[1] = FVec3_New(0.3f, 0.7f, 0.3f); - sphereColors[2] = FVec3_New(0.3f, 0.3f, 0.7f); + sphereColors[0] = FVec3_New(0.9f, 0.3f, 0.3f); + sphereColors[1] = FVec3_New(0.3f, 0.9f, 0.3f); + sphereColors[2] = FVec3_New(0.3f, 0.3f, 0.9f); } static void sceneRender() @@ -328,6 +345,7 @@ int main(int argc, char* argv[]) sceneExit(); C3D_TexDelete(&prevFrame); + C3D_RenderTargetDelete(target); C3D_Fini(); gfxExit(); diff --git a/source/vshader.v.pica b/source/vshader.v.pica index 039e67e..3e75b36 100644 --- a/source/vshader.v.pica +++ b/source/vshader.v.pica @@ -7,7 +7,7 @@ .alias far myconst.wwww .alias noHit myconst2.yyyy -.consti bounceLoopParams(4, 0, 1, 0) +.consti bounceLoopParams(3, 0, 1, 0) .consti calcSphereLoopParams(2, 0, 1, 0) .setb b0 true @@ -20,6 +20,9 @@ ; material albedo .fvec sphereColors[3] +; random numbers +.fvec rand[4] + .in inOrigin v0 .in inLowerLeftCorner v1 .in inHorizontal v2 @@ -54,6 +57,9 @@ ; calculate light bounces for bounceLoopParams + ; setup random numbers for this iteration + mov r11, rand[aL] + ; reset max ray distance mov r4.w, far @@ -147,7 +153,7 @@ rcp r3.w, r3.w mul r7.xyz, r7.xyz, r3.w - ; multiply color by albedo + ; set albedo mov r10.xyz, sphereColors[aL].xyz ; early exit label @@ -165,10 +171,10 @@ mul r4.xyz, r4.xyz, r10.xyz ; set r1 to new ray origin - add r1.xyz, r5.xyz, r7.xyz + mov r1.xyz, r5.xyz ; set r2 to new ray direction - mov r2.xyz, r7.xyz + add r2.xyz, r7.xyz, r11.xyz .end noHitLabel: @@ -181,26 +187,27 @@ end .end +; Calculate Sphere Intersection +; ----------------------------- +; ; Inputs ; ------ -; r1.xyz: ray origin -; r2.xyz: ray direction -; r3.xyz: sphere origin -; r3.w: sphere radius -; r4.w: min distance +; r1.xyz: ray origin +; r2.xyz: ray direction +; r3.xyz: sphere origin +; r3.w: sphere radius +; r4.w: min distance +; r11.xyzw: random numbers ; ; Outputs ; ------- -; r4.w: new min distance -; r10.xyz: albedo +; r4.w: new min distance +; r10.xyz: albedo ; ; Temporaries ; ----------- -; r5.xyz: new origin -; r6.xyz: new direction -; r7.xyz: hit normal -; r8.xyzw: used for calculations -; r9.xyzw: used for calculations -; -;.proc calcSphere -;.end \ No newline at end of file +; r5.xyz: new origin +; r6.xyz: new direction +; r7.xyz: hit normal +; r8.xyzw: used for calculations +; r9.xyzw: used for calculations \ No newline at end of file