Software renderer Matrix trouble

This topic is 5018 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

Hi Im making a small software renderer, it works fine until I implemented Gouraud shading. I think its my normals that becomes corrupted when I rotate them. here is a image of how it looks: www.drx.dk/images/software/software03.jpg (The lines are the vertex normals, as you can see the same vertex has diferent normals) There is only one light source and its located betwen the pyramid and user. This is how i calculate the light intensity:
		float intensity = 0;
for (int i=0; i < numLights; i++)
{
Vector3 lineOfSight = lights->pos - p;

// Should precompute this length
// FIXME! normals should be normalized when they get here
float len = normal.Magnitude();
float dot = lineOfSight.Dot(normal);

if (dot > 0)
intensity += dot/(len * lineOfSight.Magnitude());
}

if (intensity > 1.0f)
intensity = 1.0f;

return intensity;

I got it from an old book i have "Black art of 3d game programmig" by Andre LaMothe, too me this calculations doesn't seem right but that might be because im thinking of a omni light source while this computes a point light source. moving along.. I setup my pyram like this:
	Color col2(255,255,255);

Vector3 v0(0,100,0);
Vector3 v1(100,-100,100);
Vector3 v2(100,-100,-100);
Vector3 v3(-100,-100,-100);
Vector3 v4(-100,-100,100);

Vector3 verts[12] = {v0, v2, v1,
v0, v3, v2,
v0, v4, v3,
v0, v1, v4};
Color colors[12] = {col, col, col,
col, col, col,
col, col, col,
col, col, col};

Vector3 n0 = (verts[0] - verts[2]).Cross( (verts[0] - verts[1]) );
Vector3 n1 = (verts[3] - verts[5]).Cross( (verts[3] - verts[4]) );
Vector3 n2 = (verts[6] - verts[8]).Cross( (verts[6] - verts[7]) );
Vector3 n3 = (verts[9] - verts[11]).Cross( (verts[9] - verts[10]) );
//--
Vector3 nv0 = (n0 + n1 + n2 + n3) / 4;
nv0.Normalize();
Vector3 nv1 = (n0 + n3) / 2;
nv1.Normalize();
Vector3 nv2 = (n0 + n1) / 2;
nv2.Normalize();
Vector3 nv3 = (n1 + n2) / 2;
nv3.Normalize();
Vector3 nv4 = (n2 + n3) / 2;
nv4.Normalize();
//--
Vector3 normals[12] = { nv0, nv2, nv1,
nv0, nv3, nv2,
nv0, nv4, nv3,
nv0, nv1, nv4};

renderer->drawTriangles(4,verts,normals,colors);

It is translated to (0,0,500) later. now to the part where i think the problem is, the matrix. I found this from the OGL Red book: http://fly.cc.fer.hr/~unreal/theredbook/appendixg.html that states that the normals are transformed with the matrix (T^-1)^* ( that is the invers of T transposed). My matrix class looks like this: www.drx.dk/images/software/Matrix.h && www.drx.dk/images/software/Matrix.cpp I multiply my rotations matrices like this R = X * Y * Z To me it feels wrong to translate normals, should i really do that ? At the moment i don't, and then T = R and (R^-1)^* = X * Y * Z, the same as R (I think thats correct, i did a proof of it on paper). So my drawTriangles() method looks like this:
void Renderer::drawTriangles(int numTriangles, Vector3 *verts,Vector3 *normals, const Color *colors)
{
Vector2i projVerts[3];
Vector3 transVerts[3];
Vector3 transNormals[3];
Vector3 *ptrV = verts;
Vector3 *ptrN = normals;
const Color *ptrC = colors;

for (int i=0; i < numTriangles; i++, ptrV += 3, ptrN += 3, ptrC += 3)
{
transVerts[0] = matrix * ptrV[0] + translation;
transVerts[1] = matrix * ptrV[1] + translation;
transVerts[2] = matrix * ptrV[2] + translation;

if (isTriangleVisible(transVerts))
{
transNormals[0] = matrix * ptrN[0];
transNormals[1] = matrix * ptrN[1];
transNormals[2] = matrix * ptrN[2];

projVerts[0] = projectPoint(transVerts[0]);
projVerts[1] = projectPoint(transVerts[1]);
projVerts[2] = projectPoint(transVerts[2]);

graphics->drawTriangle2D(transVerts,transNormals, ptrC, projVerts);
}
}
}

graphics->drawTriangle2D() does the actualy draving of the triangle. I put up the main classes of my project if i didn't suply enough information: www.drx.dk/images/software/Renderer.h && www.drx.dk/images/software/Renderer.cpp www.drx.dk/images/software/Graphics.h && www.drx.dk/images/software/Graphics.cpp www.drx.dk/images/software/ShaderGouraud.h (I know virtual functions are a bit slow but it makes the code sooooo much cleaner and easier to change) There are a lot of commented code in those files, its old/new design ideas that haven't yet been removed/implemented, i hope it doesn't make it to messy. [Edited by - DrX on January 18, 2005 9:18:20 AM]

Share on other sites
Use the  tags, not <code>. 
 0 
 Share this post Link to post Share on other sites 
 
 
 
 Sign in to follow this   Followers 0 
 Go To Topic Listing Graphics and GPU Programming Advertisement 
 Advertisement Popular Tags 2D 3D Advice Algorithm AR C# C++ Concept Design DX11 Education Financial Gameplay General HTML5 Java Javascript Mobile Music OpenGL Optimization PC Unity Unreal Visual Studio Popular Contributors Week Month Year All Time 1 Hodgman 43 2 lawnjelly 34 3 Rutin 17 4 Oberon_Command 17 5 fleabay 15 Show More Advertisement Popular Now 14 solving x*V1 + y*V2 = V3 By Max PowerStarted Saturday at 09:59 PM 9 Quaternions, how does ki = j? By mathematicalStarted Saturday at 08:19 AM 10 OpenGL Failing to Define Like a Header File isn't Specified. By JosheirStarted Friday at 11:15 PM 12 Different data size in release/debug? (c++) By sulimanStarted Friday at 08:07 PM 17 How Smelly Is it? (c# UDP Socket Class for multiplayer game) By SeptopusStarted Friday at 01:26 AM Forum Statistics Total Topics 632906 Total Posts 3009155 Who's Online (See full list) There are no registered users currently online GameDev.net GameDev.net Articles GameDev.net Event Coverage GameDev.net Forums GameDev.net Blogs GameDev.net Gallery GameDev.net News GameDev.net Projects GDNet Chat All Activity Search In Everywhere This Forum This Topic More options... Find results that contain... All of my search term words Any of my search term words Find results in... Content titles and body Content titles only Home Forums Programming Graphics and GPU Programming Software renderer Matrix trouble 
 
 
 × Existing user? Sign In Sign Up Browse Back Articles & Tutorials Back All Categories Audio Business Game Design Industry Programming Visual Arts Columns Back GameDev Unboxed Event Coverage Back All Events Game Developers Conference Power Up Digital Games Conference GameDev.Market Links News Podcasts Back All Podcasts Game Dev Loadout Archive Community Back Beginners Back Beginners Group Beginners Forum Beginners Resources Blogs Calendar Chat Forums Back All Forums Audio Business Game Design Programming Visual Arts Community GameDev Challenges Affiliates Topical Workshops Gallery Groups Back For Beginners GameDev Challenges All Groups Projects Back All Projects Games Game Assets Game Mods Developer Tools Store Forums Back All Forums For Beginners Audio Back Music and Sound FX Games Career Development Business Back Games Career Development Production and Management Games Business and Law Game Design Back Game Design and Theory Writing for Games Programming Back Artificial Intelligence Engines and Middleware General and Gameplay Programming Graphics and GPU Programming Math and Physics Networking and Multiplayer Visual Arts Back 2D and 3D Art Critique and Feedback Community Back GameDev Challenges GDNet Lounge GDNet Comments, Suggestions, and Ideas Coding Horrors Your Announcements Hobby Project Classifieds Indie Showcase Affiliates Back NeHe Productions AngelCode Topical Workshops Careers Back Contractors Hobby Projects Game Jobs Back Browse on GameDev.Jobs Post a Job Members Back Subscriptions Chat Guidelines Leaderboard Online Users Awards Search Back All Activity My Activity Streams Back Latest Topics Featured Blogs Search var ipsDebug=false;var CKEDITOR_BASEPATH='//www.gamedev.net/applications/core/interface/ckeditor/ckeditor/';var ipsSettings={cookie_path:"/",cookie_prefix:"ips4_",cookie_ssl:true,upload_imgURL:"",message_imgURL:"",notification_imgURL:"",baseURL:"//www.gamedev.net/",jsURL:"//www.gamedev.net/applications/core/interface/js/js.php",csrfKey:"653632df6933f454b3302d608967676a",antiCache:"14de000c45",disableNotificationSounds:false,useCompiledFiles:true,links_external:true,memberID:0,analyticsProvider:"ga",viewProfiles:true,mapProvider:'google',mapApiKey:"AIzaSyAeT7tk3vnWWmbgVISkLpbhkQvekG19rHM",}; ips.setSetting('date_format',jQuery.parseJSON('"mm\/dd\/yy"'));ips.setSetting('date_first_day',jQuery.parseJSON('0'));ips.setSetting('remote_image_proxy',jQuery.parseJSON('1'));ips.setSetting('ipb_url_filter_option',jQuery.parseJSON('"none"'));ips.setSetting('url_filter_any_action',jQuery.parseJSON('"allow"'));ips.setSetting('bypass_profanity',jQuery.parseJSON('0'));ips.setSetting('emoji_style',jQuery.parseJSON('"native"'));ips.setSetting('emoji_shortcodes',jQuery.parseJSON('"1"'));ips.setSetting('emoji_ascii',jQuery.parseJSON('"1"'));ips.setSetting('emoji_cache',jQuery.parseJSON('"1"'));ips.setSetting('quickSearchDefault',jQuery.parseJSON('"all"'));ips.setSetting('quickSearchMinimum',jQuery.parseJSON('3'));ips.setSetting('quickSearchShowAdv',jQuery.parseJSON('true'));ips.setSetting('quickSearchIn',jQuery.parseJSON('"title"')); { "@context": "http://schema.org", "@type": "DiscussionForumPosting", "url": "https://www.gamedev.net/forums/topic/295180-software-renderer-matrix-trouble/", "discussionUrl": "https://www.gamedev.net/forums/topic/295180-software-renderer-matrix-trouble/", "name": "Software renderer Matrix trouble", "headline": "Software renderer Matrix trouble", "text": "Hi\n\nIm making a small software renderer, it works fine until I implemented Gouraud shading.\n\nI think its my normals that becomes corrupted when I rotate them.\n\nhere is a image of how it looks:\nwww.drx.dk/images/software/software03.jpg\n(The lines are the vertex normals, as you can see the same vertex has diferent normals)\n\nThere is only one light source and its located betwen the pyramid and user.\nThis is how i calculate the light intensity:\n\n\n\t\tfloat intensity = 0;\n\t\tfor (int i=0; i \u0026lt; numLights; i++)\n\t\t{\n\t\t\tVector3 lineOfSight = lights-\u0026gt;pos - p;\n\t\t\t\n\t\t\t// Should precompute this length\n\t\t\t// FIXME! normals should be normalized when they get here\n\t\t\tfloat len = normal.Magnitude();\n\t\t\tfloat dot = lineOfSight.Dot(normal);\n\n\t\t\tif (dot \u0026gt; 0)\n\t\t\t\tintensity += dot/(len * lineOfSight.Magnitude());\n\t\t}\n\n\t\tif (intensity \u0026gt; 1.0f)\n\t\t\tintensity = 1.0f;\n\n\t\treturn intensity;\n\n\nI got it from an old book i have \"Black art of 3d game programmig\" by Andre LaMothe, too me this calculations doesn\u0027t seem right but that might be because im thinking of a omni light source while this computes a point light source.\n\nmoving along..\nI setup my pyram like this:\n\n\tColor col2(255,255,255);\n\n\tVector3 v0(0,100,0);\n\tVector3 v1(100,-100,100);\n\tVector3 v2(100,-100,-100);\n\tVector3 v3(-100,-100,-100);\n\tVector3 v4(-100,-100,100);\n\n\tVector3 verts[12] = {v0, v2, v1,\n\t\t\t\t\t\t v0, v3, v2,\n\t\t\t\t\t\t v0, v4, v3,\n\t\t\t\t\t\t v0, v1, v4};\n\tColor colors[12] = {col, col, col, \n\t\t\t\t\t\tcol, col, col,\n\t\t\t\t\t\tcol, col, col,\n\t\t\t\t\t\tcol, col, col};\n\n\tVector3 n0 = (verts[0] - verts[2]).Cross( (verts[0] - verts[1]) );\n\tVector3 n1 = (verts[3] - verts[5]).Cross( (verts[3] - verts[4]) );\n\tVector3 n2 = (verts[6] - verts[8]).Cross( (verts[6] - verts[7]) );\n\tVector3 n3 = (verts[9] - verts[11]).Cross( (verts[9] - verts[10]) );\n\t//--\n\tVector3 nv0 = (n0 + n1 + n2 + n3) / 4;\n\tnv0.Normalize();\n\tVector3 nv1 = (n0 + n3) / 2;\n\tnv1.Normalize();\n\tVector3 nv2 = (n0 + n1) / 2;\n\tnv2.Normalize();\n\tVector3 nv3 = (n1 + n2) / 2;\n\tnv3.Normalize();\n\tVector3 nv4 = (n2 + n3) / 2;\n\tnv4.Normalize();\n\t//--\n\tVector3 normals[12] = { nv0, nv2, nv1,\n\t\t\t\t\t\t\tnv0, nv3, nv2,\n\t\t\t\t\t\t\tnv0, nv4, nv3,\n\t\t\t\t\t\t\tnv0, nv1, nv4};\n\n\trenderer-\u0026gt;drawTriangles(4,verts,normals,colors);\n\n\nIt is translated to (0,0,500) later.\n\nnow to the part where i think the problem is, the matrix.\nI found this from the OGL Red book:\nhttp://fly.cc.fer.hr/~unreal/theredbook/appendixg.html\n\nthat states that the normals are transformed with the matrix (T^-1)^* ( that is the invers of T transposed).\nMy matrix class looks like this:\nwww.drx.dk/images/software/Matrix.h \u0026amp;\u0026amp; www.drx.dk/images/software/Matrix.cpp\n\nI multiply my rotations matrices like this R = X * Y * Z\nTo me it feels wrong to translate normals, should i really do that ?\nAt the moment i don\u0027t, and then T = R and (R^-1)^* = X * Y * Z, the same as R (I think thats correct, i did a proof of it on paper).\n\nSo my drawTriangles() method looks like this:\n\nvoid Renderer::drawTriangles(int numTriangles, Vector3 *verts,Vector3 *normals, const Color *colors)\n{\n\tVector2i projVerts[3];\n\tVector3 transVerts[3];\n\tVector3 transNormals[3];\n\tVector3 *ptrV = verts;\n\tVector3 *ptrN = normals;\n\tconst Color *ptrC = colors;\n\n\tfor (int i=0; i \u0026lt; numTriangles; i++, ptrV += 3, ptrN += 3, ptrC += 3)\n\t{\n\t\ttransVerts[0] = matrix * ptrV[0] + translation;\n\t\ttransVerts[1] = matrix * ptrV[1] + translation;\n\t\ttransVerts[2] = matrix * ptrV[2] + translation;\n\n\t\tif (isTriangleVisible(transVerts))\n\t\t{\n\t\t\ttransNormals[0] = matrix * ptrN[0];\n\t\t\ttransNormals[1] = matrix * ptrN[1];\n\t\t\ttransNormals[2] = matrix * ptrN[2];\n\n\t\t\tprojVerts[0] = projectPoint(transVerts[0]);\n\t\t\tprojVerts[1] = projectPoint(transVerts[1]);\n\t\t\tprojVerts[2] = projectPoint(transVerts[2]);\n\n\t\t\tgraphics-\u0026gt;drawTriangle2D(transVerts,transNormals, ptrC, projVerts);\n\t\t}\n\t}\n}\n\n\ngraphics-\u0026gt;drawTriangle2D() does the actualy draving of the triangle.\n\nI put up the main classes of my project if i didn\u0027t suply enough information:\nwww.drx.dk/images/software/Renderer.h \u0026amp;\u0026amp; www.drx.dk/images/software/Renderer.cpp\nwww.drx.dk/images/software/Graphics.h \u0026amp;\u0026amp; www.drx.dk/images/software/Graphics.cpp\nwww.drx.dk/images/software/ShaderGouraud.h \n\n(I know virtual functions are a bit slow but it makes the code sooooo much cleaner and easier to change)\nThere are a lot of commented code in those files, its old/new design ideas that haven\u0027t yet been removed/implemented, i hope it doesn\u0027t make it to messy.\n\n\n[Edited by - DrX on January 18, 2005 9:18:20 AM]\n", "dateCreated": "2005-01-18T08:47:18+0000", "datePublished": "2005-01-18T08:47:18+0000", "pageStart": 1, "pageEnd": 1, "image": "https://secure.gravatar.com/avatar/002e6e7aad8bad44ee44bbe2b2cd11c7?d=https://www.gamedev.net/uploads/monthly_2017_08/D.png.926525f9b92982ffcb7effeda2a79a8d.png", "author": { "@type": "Person", "name": "DrX", "image": "https://secure.gravatar.com/avatar/002e6e7aad8bad44ee44bbe2b2cd11c7?d=https://www.gamedev.net/uploads/monthly_2017_08/D.png.926525f9b92982ffcb7effeda2a79a8d.png", "url": "https://www.gamedev.net/profile/75053-drx/" }, "interactionStatistic": [ { "@type": "InteractionCounter", "interactionType": "http://schema.org/ViewAction", "userInteractionCount": 302 }, { "@type": "InteractionCounter", "interactionType": "http://schema.org/CommentAction", "userInteractionCount": 1 }, { "@type": "InteractionCounter", "interactionType": "http://schema.org/FollowAction", "userInteractionCount": 23 } ], "comment": [ { "@type": "Comment", "url": "https://www.gamedev.net/forums/topic/295180-software-renderer-matrix-trouble/?do=findComment\u0026comment=295180", "author": { "@type": "Person", "name": "DrX", "image": "https://secure.gravatar.com/avatar/002e6e7aad8bad44ee44bbe2b2cd11c7?d=https://www.gamedev.net/uploads/monthly_2017_08/D.png.926525f9b92982ffcb7effeda2a79a8d.png", "url": "https://www.gamedev.net/profile/75053-drx/" }, "dateCreated": "2005-01-18T08:47:18+0000", "text": "Hi\n\nIm making a small software renderer, it works fine until I implemented Gouraud shading.\n\nI think its my normals that becomes corrupted when I rotate them.\n\nhere is a image of how it looks:\nwww.drx.dk/images/software/software03.jpg\n(The lines are the vertex normals, as you can see the same vertex has diferent normals)\n\nThere is only one light source and its located betwen the pyramid and user.\nThis is how i calculate the light intensity:\n\n\n\t\tfloat intensity = 0;\n\t\tfor (int i=0; i \u0026lt; numLights; i++)\n\t\t{\n\t\t\tVector3 lineOfSight = lights-\u0026gt;pos - p;\n\t\t\t\n\t\t\t// Should precompute this length\n\t\t\t// FIXME! normals should be normalized when they get here\n\t\t\tfloat len = normal.Magnitude();\n\t\t\tfloat dot = lineOfSight.Dot(normal);\n\n\t\t\tif (dot \u0026gt; 0)\n\t\t\t\tintensity += dot/(len * lineOfSight.Magnitude());\n\t\t}\n\n\t\tif (intensity \u0026gt; 1.0f)\n\t\t\tintensity = 1.0f;\n\n\t\treturn intensity;\n\n\nI got it from an old book i have \"Black art of 3d game programmig\" by Andre LaMothe, too me this calculations doesn\u0027t seem right but that might be because im thinking of a omni light source while this computes a point light source.\n\nmoving along..\nI setup my pyram like this:\n\n\tColor col2(255,255,255);\n\n\tVector3 v0(0,100,0);\n\tVector3 v1(100,-100,100);\n\tVector3 v2(100,-100,-100);\n\tVector3 v3(-100,-100,-100);\n\tVector3 v4(-100,-100,100);\n\n\tVector3 verts[12] = {v0, v2, v1,\n\t\t\t\t\t\t v0, v3, v2,\n\t\t\t\t\t\t v0, v4, v3,\n\t\t\t\t\t\t v0, v1, v4};\n\tColor colors[12] = {col, col, col, \n\t\t\t\t\t\tcol, col, col,\n\t\t\t\t\t\tcol, col, col,\n\t\t\t\t\t\tcol, col, col};\n\n\tVector3 n0 = (verts[0] - verts[2]).Cross( (verts[0] - verts[1]) );\n\tVector3 n1 = (verts[3] - verts[5]).Cross( (verts[3] - verts[4]) );\n\tVector3 n2 = (verts[6] - verts[8]).Cross( (verts[6] - verts[7]) );\n\tVector3 n3 = (verts[9] - verts[11]).Cross( (verts[9] - verts[10]) );\n\t//--\n\tVector3 nv0 = (n0 + n1 + n2 + n3) / 4;\n\tnv0.Normalize();\n\tVector3 nv1 = (n0 + n3) / 2;\n\tnv1.Normalize();\n\tVector3 nv2 = (n0 + n1) / 2;\n\tnv2.Normalize();\n\tVector3 nv3 = (n1 + n2) / 2;\n\tnv3.Normalize();\n\tVector3 nv4 = (n2 + n3) / 2;\n\tnv4.Normalize();\n\t//--\n\tVector3 normals[12] = { nv0, nv2, nv1,\n\t\t\t\t\t\t\tnv0, nv3, nv2,\n\t\t\t\t\t\t\tnv0, nv4, nv3,\n\t\t\t\t\t\t\tnv0, nv1, nv4};\n\n\trenderer-\u0026gt;drawTriangles(4,verts,normals,colors);\n\n\nIt is translated to (0,0,500) later.\n\nnow to the part where i think the problem is, the matrix.\nI found this from the OGL Red book:\nhttp://fly.cc.fer.hr/~unreal/theredbook/appendixg.html\n\nthat states that the normals are transformed with the matrix (T^-1)^* ( that is the invers of T transposed).\nMy matrix class looks like this:\nwww.drx.dk/images/software/Matrix.h \u0026amp;\u0026amp; www.drx.dk/images/software/Matrix.cpp\n\nI multiply my rotations matrices like this R = X * Y * Z\nTo me it feels wrong to translate normals, should i really do that ?\nAt the moment i don\u0027t, and then T = R and (R^-1)^* = X * Y * Z, the same as R (I think thats correct, i did a proof of it on paper).\n\nSo my drawTriangles() method looks like this:\n\nvoid Renderer::drawTriangles(int numTriangles, Vector3 *verts,Vector3 *normals, const Color *colors)\n{\n\tVector2i projVerts[3];\n\tVector3 transVerts[3];\n\tVector3 transNormals[3];\n\tVector3 *ptrV = verts;\n\tVector3 *ptrN = normals;\n\tconst Color *ptrC = colors;\n\n\tfor (int i=0; i \u0026lt; numTriangles; i++, ptrV += 3, ptrN += 3, ptrC += 3)\n\t{\n\t\ttransVerts[0] = matrix * ptrV[0] + translation;\n\t\ttransVerts[1] = matrix * ptrV[1] + translation;\n\t\ttransVerts[2] = matrix * ptrV[2] + translation;\n\n\t\tif (isTriangleVisible(transVerts))\n\t\t{\n\t\t\ttransNormals[0] = matrix * ptrN[0];\n\t\t\ttransNormals[1] = matrix * ptrN[1];\n\t\t\ttransNormals[2] = matrix * ptrN[2];\n\n\t\t\tprojVerts[0] = projectPoint(transVerts[0]);\n\t\t\tprojVerts[1] = projectPoint(transVerts[1]);\n\t\t\tprojVerts[2] = projectPoint(transVerts[2]);\n\n\t\t\tgraphics-\u0026gt;drawTriangle2D(transVerts,transNormals, ptrC, projVerts);\n\t\t}\n\t}\n}\n\n\ngraphics-\u0026gt;drawTriangle2D() does the actualy draving of the triangle.\n\nI put up the main classes of my project if i didn\u0027t suply enough information:\nwww.drx.dk/images/software/Renderer.h \u0026amp;\u0026amp; www.drx.dk/images/software/Renderer.cpp\nwww.drx.dk/images/software/Graphics.h \u0026amp;\u0026amp; www.drx.dk/images/software/Graphics.cpp\nwww.drx.dk/images/software/ShaderGouraud.h \n\n(I know virtual functions are a bit slow but it makes the code sooooo much cleaner and easier to change)\nThere are a lot of commented code in those files, its old/new design ideas that haven\u0027t yet been removed/implemented, i hope it doesn\u0027t make it to messy.\n\n\n[Edited by - DrX on January 18, 2005 9:18:20 AM]\n", "mainEntityOfPage": "https://www.gamedev.net/forums/topic/295180-software-renderer-matrix-trouble/" }, { "@type": "Comment", "url": "https://www.gamedev.net/forums/topic/295180-software-renderer-matrix-trouble/?do=findComment\u0026comment=2867886", "author": { "@type": "Person", "name": "kSquared", "image": "https://secure.gravatar.com/avatar/9df97a3e749c726188038b46709399ed?d=https://www.gamedev.net/uploads/monthly_2017_08/K.png.155209ebb5af3bb0af6b1ff144dec40e.png", "url": "https://www.gamedev.net/profile/70017-ksquared/" }, "dateCreated": "2005-01-18T08:53:53+0000", "text": "Use the tags, not \u0026lt;code\u0026gt;.", "mainEntityOfPage": "https://www.gamedev.net/forums/topic/295180-software-renderer-matrix-trouble/" } ] } { "@context": "http://www.schema.org", "@type": "WebSite", "name": "GameDev.net", "url": "https://www.gamedev.net/", "potentialAction": { "type": "SearchAction", "query-input": "required name=query", "target": "https://www.gamedev.net/search/?q={query}" }, "inLanguage": [ { "@type": "Language", "name": "English (USA)", "alternateName": "en-US" } ] } { "@context": "http://www.schema.org", "@type": "Organization", "name": "GameDev.net", "url": "https://www.gamedev.net/", "address": { "@type": "PostalAddress", "streetAddress": "", "addressLocality": null, "addressRegion": null, "postalCode": null, "addressCountry": null } } { "@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "item": { "@id": "https://www.gamedev.net/forums/", "name": "Forums" } }, { "@type": "ListItem", "position": 2, "item": { "@id": "https://www.gamedev.net/forums/forum/4-programming/", "name": "Programming" } }, { "@type": "ListItem", "position": 3, "item": { "@id": "https://www.gamedev.net/forums/forum/5-graphics-and-gpu-programming/", "name": "Graphics and GPU Programming" } } ] } { "@context": "http://schema.org", "@type": "ContactPage", "url": "https://www.gamedev.net/contact/" } Important Information By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.   I accept We are the game development community. Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up! Sign me up!