mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-15 02:25:32 -04:00
SoftGPU: Sort of renders properly now
This commit is contained in:
parent
de69850731
commit
1a82ef84ce
@ -137,7 +137,7 @@ void Gfx_ClearBuffers(GfxBuffers buffers) {
|
|||||||
for (i = 0; i < size; i++) colorBuffer[i] = clearColor;
|
for (i = 0; i < size; i++) colorBuffer[i] = clearColor;
|
||||||
}
|
}
|
||||||
if (buffers & GFX_BUFFER_DEPTH) {
|
if (buffers & GFX_BUFFER_DEPTH) {
|
||||||
for (i = 0; i < size; i++) depthBuffer[i] = 1.0f;
|
for (i = 0; i < size; i++) depthBuffer[i] = 100000000.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,7 +341,7 @@ static void DrawTriangle(Vector4 frag1, Vector4 frag2, Vector4 frag3,
|
|||||||
if (faceCulling) {
|
if (faceCulling) {
|
||||||
// https://gamedev.stackexchange.com/questions/203694/how-to-make-backface-culling-work-correctly-in-both-orthographic-and-perspective
|
// https://gamedev.stackexchange.com/questions/203694/how-to-make-backface-culling-work-correctly-in-both-orthographic-and-perspective
|
||||||
int sign = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
|
int sign = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
|
||||||
if (sign < 0) return;
|
if (sign > 0) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reject triangles completely outside
|
// Reject triangles completely outside
|
||||||
@ -351,14 +351,17 @@ static void DrawTriangle(Vector4 frag1, Vector4 frag2, Vector4 frag3,
|
|||||||
// Perform scissoring
|
// Perform scissoring
|
||||||
minX = max(minX, 0); maxX = min(maxX, sc_maxX);
|
minX = max(minX, 0); maxX = min(maxX, sc_maxX);
|
||||||
minY = max(minY, 0); maxY = min(maxY, sc_maxY);
|
minY = max(minY, 0); maxY = min(maxY, sc_maxY);
|
||||||
// TODO why doesn't this work
|
|
||||||
|
|
||||||
// NOTE: W in frag variables below is actually 1/W
|
// NOTE: W in frag variables below is actually 1/W
|
||||||
float factor = 1.0f / ((y2 - y3) * (x1 - x3) + (x3 - x2) * (y1 - y3));
|
float factor = 1.0f / ((y2 - y3) * (x1 - x3) + (x3 - x2) * (y1 - y3));
|
||||||
|
|
||||||
|
// TODO proper clipping
|
||||||
|
if (frag1.w <= 0 || frag2.w <= 0 || frag3.w <= 0) return;
|
||||||
|
|
||||||
for (int y = minY; y <= maxY; y++) {
|
for (int y = minY; y <= maxY; y++) {
|
||||||
for (int x = minX; x <= maxX; x++) {
|
for (int x = minX; x <= maxX; x++) {
|
||||||
float ic0 = ((y2 - y3) * (x - x3) + (x3 - x2) * (y - y3)) * factor;
|
float ic0 = ((y2 - y3) * (x - x3) + (x3 - x2) * (y - y3)) * factor;
|
||||||
|
|
||||||
if (ic0 < 0 || ic0 > 1) continue;
|
if (ic0 < 0 || ic0 > 1) continue;
|
||||||
float ic1 = ((y3 - y1) * (x - x3) + (x1 - x3) * (y - y3)) * factor;
|
float ic1 = ((y3 - y1) * (x - x3) + (x1 - x3) * (y - y3)) * factor;
|
||||||
if (ic1 < 0 || ic1 > 1) continue;
|
if (ic1 < 0 || ic1 > 1) continue;
|
||||||
@ -369,7 +372,7 @@ static void DrawTriangle(Vector4 frag1, Vector4 frag2, Vector4 frag3,
|
|||||||
float w = 1 / (ic0 * frag1.w + ic1 * frag2.w + ic2 * frag3.w);
|
float w = 1 / (ic0 * frag1.w + ic1 * frag2.w + ic2 * frag3.w);
|
||||||
float z = (ic0 * frag1.z + ic1 * frag2.z + ic2 * frag3.z) * w;
|
float z = (ic0 * frag1.z + ic1 * frag2.z + ic2 * frag3.z) * w;
|
||||||
|
|
||||||
if (depthTest && (z < 0 || z <= depthBuffer[index])) continue;
|
if (depthTest && (z < 0 || z > depthBuffer[index])) continue;
|
||||||
if (depthWrite) depthBuffer[index] = z;
|
if (depthWrite) depthBuffer[index] = z;
|
||||||
if (!colWrite) continue;
|
if (!colWrite) continue;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user