• Content count

  • Joined

  • Last visited

Community Reputation

278 Neutral

About afraidofdark

  • Rank
  1. Calculating Irradiance Map

    I have lived enough enlightenment today thanks to scratchapixel ! I've seen the light ! (Literally) Since I used a cube map to look up incoming radiance, I tie my hands to use an approximation of the actual integral. Because for incoming radiance, I don't have a function which I can integrate over spherical coordinates !
  2. Calculating Irradiance Map Now I understand how the author traversed over the hemisphere. However there is still a problem. In monte carlo integration, you consider the integration out put as the average of random samples. This is why we divide the sum by "index". However, this part isn't clear to me yet. If I want to approximate x^2 integral over 0 to 5 period, does this method suggest me to take for example 100 random number in that interval and average them, and expect this outcome as my integration result ?
  3. I am trying to calculate irradiance map based on this article: I understand the idea, you must place an hemisphere over the normal, then you need to sum every incoming radiance. Then write the radiance back at the corresponding pixel in the cube map. However I didn't understand how author iterated over the hemisphere and the direct translation from hlsl code to glsl didn't worked as I expected. It smooth the original cube map a lot. As if I dropped resolution from 1024px to 32px. I changed the hemisphere iteration as below: normal = normalize(normal); vec3 up = vec3(0.0, 1.0, 0.0); vec3 right = normalize(cross(normal, up)); int index = 0; vec3 irradiance = vec3(0.0 ,0.0 ,0.0); for (float longi = 0.0; longi <= 90.0; longi += 3.0) { mat4 trl = rotationMatrix(right, radians(longi)); for (float azi = 0.0; azi <= 360.0; azi += 3.0) { mat4 tra = rotationMatrix(normal, radians(azi)); vec3 sampleVec = (tra * trl * vec4(normal, 1.0)).xyz; irradiance += texture(iChannel0, sampleVec).rgb * dot(sampleVec, normal); index++; } } fragColor = vec4((PI * irradiance / float(index)), 1.0); Generated irradiance map seems to me too bright. Also I don't understand why we are averaging the summed radiance by dividing it to "index" ? Aren't we after the total incoming radiance to a point ? Here is the link to the shader.
  4. OpenGL Quake3 ambient lighting

    Increasing sample count and applying attenuation based on distance may produce a good result. I'll definitely give this a shot. One of my question remained unanswered. How modern engines does this ? Is there a paper, tutorial or a chapter from a book that explains ue4's light cache or Unitiy's light probe ? Before implementing anything I like to know about this.
  5. I have just noticed that, in quake 3 and half - life, dynamic models are effected from light map. For example in dark areas, gun that player holds seems darker. How did they achieve this effect ? I can use image based lighting techniques however (Like placing an environment probe and using it for reflections and ambient lighting), this tech wasn't used in games back then, so there must be a simpler method to do this. Here is a link that shows how modern engines does it. Indirect Lighting Cache It would be nice if you know a paper that explains this technique. Can I apply this to quake 3' s light map generator and bsp format ?
  6. There is a very good game loop in the link which is tailored for windows forms. I need it in c++/cli so I converted the code as below. Here is my main loop. using namespace System; using namespace System::Windows::Forms; HWND g_theAppHandle = nullptr; bool IsApplicationIdle() { MSG msg; return PeekMessage(&msg, g_theAppHandle, 0, 0, 0) == 0; } void OnIdle(System::Object ^sender, System::EventArgs ^e) { while (IsApplicationIdle()) { if (PunkEd::ABTCLI::g_initSuccess) { PunkEd::ABTCLI::Frame(0.0f); } } } [STAThread] int CALLBACK WinMain( _In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow ) { _CrtMemState memstate; _CrtMemCheckpoint(&memstate); PunkEd::PunkEdMain^ theApp = gcnew PunkEd::PunkEdMain; g_theAppHandle = (HWND)theApp->Handle.ToPointer(); Application::Idle += gcnew System::EventHandler(&OnIdle); Application::Run(theApp); _CrtMemDumpAllObjectsSince(&memstate); return 0; } This loop triggers PunkEd::ABTCLI::Frame(0.0f); every time the application is idle. And Frame(float deltaTime); function trigger everyting related to game. Like render and physics. However my rendering window is a panel. And I override its mouse move callback as below. private: System::Void panel1_MouseMove(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { Debug::WriteLine(e->Location); glm::vec3 cp = glm::vec3(e->Location.X, e->Location.Y, 0); glm::mat4 view = g_camera->GetViewMatrix(); glm::mat4 project = g_camera->m_projection; glm::unProject(cp, view, project, glm::vec4(0.0f, 0.0f, (float)panel1->Width, (float)panel1->Height)); cp.x -= panel1->Width / 2.0f; cp.y -= panel1->Height / 2.0f; g_cursor->m_node->m_translation = cp.xzy; } This function updates my curser's position in the game. However my render function is get called after I stop moving the mouse. How can I overcome this stuation such that my curser position gets update and renders immediatly after I moved mouse.
  7. Need feedback- animations for game

    I liked it. May be you can make it act more frantic ? By the way, I am working on a framework which can give web outputs. Here is a sample I can make your character interactive. I need portfolio too. :) Sure you can use unity maybe unreal engine and it would be more proffesional looking. However, contact me if you are interested. I'd be glad to add something to this job if possible.
  8. I want to scale an object in different spaces. For example, in a hierarchical system I want to scale a node as if it is in its parent coordinate space, or in world space. void ABT::Node::Scale(glm::vec3 val, TransformationSpace space) { switch (space) { case ABT::TS_WORLD: { glm::quat ws = GetOrientation(ABT::TS_WORLD); m_scale += ws * val * glm::inverse(ws); } break; case ABT::TS_PARENT: { glm::quat ps; if (m_parent) ps = m_parent->GetOrientation(ABT::TS_WORLD); m_scale += ps * val * glm::inverse(ps); } break; case ABT::TS_LOCAL: { glm::quat ls = GetOrientation(ABT::TS_LOCAL); m_scale += ls * val * glm::inverse(ls); } break; } } Bad think with this code is, it doesn't apply transformation to one axis. It applies all three of them when I observe it.
  9. Project: A game engine embedded in to 3ds Max. (Similar to Blender Game Engine)   Goal: Creating an artist friendly game and interactive application development environment in 3ds Max.   This is a "working in progress" project. We develop both a plug-in for max to syncronize max scene with our game engine and also game engine it self. In the end, we have seen that 3ds Max become a nice WYSIWYG editor for our game engine and the project is doable with the 3ds Max SDK.   We think that the idea has some potential espacially for 3ds max users but we are a small team so we are considering to move on an open source engine, URHO3D and bring this idea to life.   Your thoughts and comments are very welcome.   More about project:
  10. 3ds max plugin Y axis Up Right Handed coordinates

    I search through web for changing up axis of max. Many people say, there isn't such option here is my solution which matches all axis with opengl -- rotate selected object obj = $ rotate $ (angleaxis -90 [1,0,0]) a = $.pos.z $.pos.z = -$.pos.y; $.pos.y = a;
  11. Hello,  We are using physx 3d max plugin (3ds Max DCC plug-in 2.8.9 (v03131509)) and export physx scene for 3.x engine as xml file. The problem is, we couldn't find an option to change up axis (max is using z as up) and I strongly believe there is none In order to fix the problem we rotate and translate relevant objects. But this trick doesn't seem to be a good solution more over I suspect it will work for constrains. (And it is problematic, we are doing a lot of tricky things to export the scene properly)   Probably there are people like us out there. How did you overcome the problem ? Thanks
  12. lighting in 3d max realistic mode

    yep, I did it. Now my lights behave exactly like max lights. The only difference than standard phong - point light shading is that; they apply a gamma correction, and inverse linearly (based on distance) scale the attenuation of the light. also the effective area thing that I explained above.   here is the final result. It is good enough for me.  
  13. lighting in 3d max realistic mode

    Applying gamma correction really helped a lot. However in max, light stop smoothly when it reaches its radius. I am trying to implement it cheaply. Here is the progress  
  14. Hello, I am trying to implement lighting as close as possible to lighting done in 3ds max 2013 (realistic mode) Here are the things that I make similar with max's lights and material in order to get same results   attenuation is inverse square in both max and my lighting material diffuse, ambient & specular colors. Glossiness & specular level are same both materials have phong shading model point light effective area (where lights attenuation is 1) and light radius are same   Effective area start from lights origin and and has a radius "e", every pixel fall in to that region has an attenuation factor of 1 After effective region every light shows inverse square attenuation characteristic. I come to this solution after investigating and examining how lighting and attenuation is handled in max. But I still cant figure out how exactly lighting is handled in max. here is what I've got so far.     Each light in max dominates its region with its color more clearly, in my program colors are mixed and green dominates the scene and blue is almost lost. This might be a gamma problem I am not sure, so I ask your opinions.    To see the difference more clearly I changed the contrast of the image also here is my lighting shader void phongOmni(out float3 diffCont, out float3 specCont, in light lght, in material mat, in VS_OUT inp) { float3 ep = mul(eyePos, invWorld).xyz; // object space eye position float4 l4p; = lght.position; l4p.w = 1; float3 lp = mul(l4p, invWorld).xyz; // object space light position // lighting float3 n = normalize(inp.n); float3 v = normalize(ep - inp.p); float3 l = normalize(lp - inp.p); float3 h = normalize(v + l); float diffMag = max(dot(n, l), 0); diffCont = lght.color * diffMag; // diffuse contribution float specMag = pow(max(dot(n, h), 0), mat.glossiness * 100); specCont = mat.specularLevel * lght.color * specMag; // specular contribution // Attenuation float d = distance(lp, inp.p); float r = lght.attenuationEnd; float e = lght.attenuationStart; // if distance of the pixel to the light is less than effective region "e" // pixel's attenuation is 1 float att = 1; if (d > e) { d = d - e; r = r - e; float denom = d / r + 1; att = 1 / (denom * denom); } // if attenuation is less than 0.005 than it has a 0 attenuation att = (att - 0.005) / (1 - 0.005); att = max(att, 0); specCont *= att; diffCont *= att; } float3 PS(VS_OUT inp) : SV_Target { float3 dacum = float3(0, 0, 0); // specular light accumulation float3 sacum = float3(0, 0, 0); // diffuse light accumulation for (int i = 0; i < lightCount; i++) { float3 diffCont; float3 specCont; phongOmni(diffCont, specCont, lights[i], mat, inp); dacum += diffCont; sacum += specCont; } float3 color = (sacum + ((dacum + mat.ambientColor) * mat.diffuseColor)); return color; }    
  15. Hello,  I pass a material definition structure from c++ to hlsl however in the debug view I see some of the values are NAN here is my c++, hlsl structure definitions and debug view results. Only unused0 must be NAN I use it as padding variable, however all other float values are olso NAN I couldn't point out the problem here, may be you can    C++ structure struct MaterialData { Vector3 diffuseColor; float unused0; Vector3 specularColor; float specularLevel; Vector3 ambientColor; float glossiness; };   Shader structure struct material { float3 diffuseColor; float unused0; float3 specularColor; float specularLevel; float3 ambientColor; float glossiness; };   Shader debug values diffuseColor x = 0.588000000, y = 0.588000000, z = 0.588000000 float3 unused0 NaN float specularColor x = 0.900000000, y = 0.900000000, z = 0.900000000 float3 specularLevel NaN float ambientColor x = 0.588000000, y = 0.588000000, z = 0.588000000 float3 glossiness NaN float