• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.


  • Content count

  • Joined

  • Last visited

Community Reputation

106 Neutral


  • Rank
  1. I know one method .when you have changed the render target ,then do this       ID3D10ShaderResourceView* pSRV[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };     pDev->PSSetShaderResources( 0, _countof(pSRV), pSRV );
  2. both cube and sphere can use  cube-dds as their texture
  3. for more information I past the Terrain.fx ///////////////////////////??///////////////////////////////////////////////// Texture2D txDetail_Water:DETAIL_WATER; Texture2D txDetail_Stone:DETAIL_STONE; Texture2D txDetail_Sand:DETAIL_SAND; Texture2D txDetail_Grass:DETAIL_GRASS; Texture2D txDetail_Bush:DETAIL_BUSH; Texture2D txDetail_Tree:DETAIL_TREE; Texture2D txDetail_Rock:DETAIL_ROCK; Texture2D txDetail_City:DETAIL_CITY; Texture2D txDetail_Snow:DETAIL_SNOW; Texture2D txSuface:SURFACETEX; Texture2D txDiff:DIFFUSETEX; Texture2D txHeight:HEIGHTTEX; Texture2D WaterNormal:TEX_WATER_N; //water normal ,tbn space to model space????????? static float3x3 M33_TBN_To_M = { 1.0f,0.0f,0.0f,0.0f,0.0f,-1.0f,0.0f,1.0f,0.0f }; //???? //water 0 0.000 0 //stone 1 0.125 32 //sand 2 0.250 64 //Grass 3 0.375 96 //bush 4 0.500 128 //Tree 5 0.625 160 //Rock 6 0.750 192 //City 7 0.875 224 //snow 8 1.000 255 //????????????//blend the draft tex and detail static float2 detailMinMax=float2(200.0f,1000.0f); SamplerState SamHeight { Texture = (txHeight); Filter = ANISOTROPIC; //Filter = MIN_MAG_MIP_POINT; AddressU = Mirror; AddressV = Mirror; MaxAnisotropy=4; }; SamplerState SamTexture { Filter = ANISOTROPIC; AddressU = Wrap; AddressV = Wrap; MaxAnisotropy=8; }; SamplerState PointSample { Filter = MIN_MAG_MIP_POINT; AddressU = Wrap; AddressV = Wrap; }; ///////////////////////////??////////////////////////////////////////////////// cbuffer transformDate { float4x4 m44_V:VIEW;// float4x4 m44_WV_NOSCALE:WV_NOSCALE; float4x4 m44_WV:WORLDVIEW; float4x4 m44_WVP:WORLDVIEWPROJ; float3 v3_CamPos:CAMPOS; float4 exPP:EXTEND_PP;//DetailRepeat HeigntMapWidth areaWidth,segs float4 exPP_1:EXTEND_PP_1;//scaleFnK,scaleFnB,fTime,mMTimeLoop(Mtime?0-2Pi??) //terrain height= tex.r* scaleFnK+scaleFnB; float4x4 m44_WVP_L:WORLDVIEWPROJ_L; float2 WaveUVOffset0:W_UV_0; float2 WaveUVOffset1:W_UV_1; float WaveUVRepeat:W_UV_REPEAT; } struct VS_IN { float4 posL: POSITION; float3 nor: NORMAL; float2 texCoor:TEXCOORD; }; struct PS_IN_MAIN { float4 pos:SV_POSITION; float3 norView:NORMAL; float2 texCoor:TEXCOORD0; float4 posView:TEXCOORD1; }; struct PS_OUT_MAIN { float4 G0 : SV_Target0;//texture float4 G1 : SV_Target1;//nor float4 G2: SV_Target2;//pos }; struct PS_IN_L { float4 pos:SV_POSITION; }; float3 GetModelPos(in float2 UV) { float x=(UV.x-0.5)*exPP.z; float z=(0.5-UV.y)*exPP.z; float y=tex2Dlod(SamHeight, float4(UV, 0,0)).r*exPP_1.x+exPP_1.y; return float3(x,y,z); } /////////////?? VS////////////// PS_IN_L VS_Light(VS_IN vIn) { PS_IN_L vOut=(PS_IN_L) 0; float4 tranformedPos=vIn.posL; tranformedPos.y=tex2Dlod(SamHeight, float4(vIn.texCoor, 0,0)).r*exPP_1.x+exPP_1.y; vOut.pos=mul(tranformedPos,m44_WVP_L); return vOut; } ///////////??PS//////////////// //????????????//only need z,no output void PS_Light(PS_IN_L pIn) { } /////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //9???????1/8=0.125,??9?????,?? static float surfaceTypeDistance=0.125f; /////////??VS//////////// PS_IN_MAIN VS_Main(VS_IN vIn) { PS_IN_MAIN vOut=(PS_IN_MAIN) 0; float UVOffset=1/(exPP.w-1); float4 tranformedPos=vIn.posL; float3 PosC=GetModelPos(vIn.texCoor); tranformedPos.y=PosC.y; //Compute normal float3 PosL=GetModelPos(vIn.texCoor+float2(-UVOffset,0)); float3 PosR=GetModelPos(vIn.texCoor+float2(UVOffset,0)); float3 PosUp=GetModelPos(vIn.texCoor+float2(0,-UVOffset)); float3 PosDown=GetModelPos(vIn.texCoor+float2(0,UVOffset)); float3 dirUp=PosUp-PosC; float3 dirRight=PosR-PosC; float3 dirDown=PosDown-PosC; float3 dirLeft=PosL-PosC; float3 nor=normalize(cross(dirUp,dirRight)); nor+=normalize(cross(dirRight,dirDown)); nor+=normalize(cross(dirDown,dirLeft)); nor+=normalize(cross(dirLeft,dirUp)); nor=normalize(nor); vOut.norView=normalize(mul(nor,(float3x3)m44_V)); vOut.texCoor=vIn.texCoor; vOut.pos=mul(tranformedPos,m44_WVP); vOut.posView=mul(tranformedPos,m44_WV); return vOut; } ////////??PS//////////// PS_OUT_MAIN PS_Main(PS_IN_MAIN pIn) { PS_OUT_MAIN pOut=(PS_OUT_MAIN) 0; // float3 normalColor= txNor.Sample(SamTexture, pIn.texCoor).xyz*2-1; pOut.G1.xyz=pIn.norView;//mul(normalize(normalColor),(float3x3)m44_V); //pOut.G1.xyz=normalColor; pOut.G1.w=0; // float3 worldNor=normalize(tex2Dlod(SamNor, float4(vIn.texCoor, 0,0))*2-1); ///???? //(x>=y true) float detailUVRepeat=10.0f; float3 texD_0=txDetail_Water.Sample( SamTexture, pIn.texCoor*detailUVRepeat*5).rgb; float3 texD_1=txDetail_Stone.Sample( SamTexture, pIn.texCoor*detailUVRepeat*5).rgb; float3 texD_2=txDetail_Sand.Sample( SamTexture, pIn.texCoor*detailUVRepeat*100).rgb; float3 texD_3=txDetail_Grass.Sample( SamTexture, pIn.texCoor*detailUVRepeat*10).rgb; float3 texD_4=txDetail_Bush.Sample( SamTexture, pIn.texCoor*detailUVRepeat*10).rgb; float3 texD_5=txDetail_Tree.Sample( SamTexture, pIn.texCoor*detailUVRepeat).rgb; float3 texD_6=txDetail_Rock.Sample(SamTexture, pIn.texCoor*detailUVRepeat).rgb; float3 texD_7=txDetail_City.Sample( SamTexture, pIn.texCoor*detailUVRepeat).rgb; float3 texD_8=txDetail_Snow.Sample( SamTexture, pIn.texCoor*detailUVRepeat).rgb; float surfValue=txSuface.Sample(SamTexture, pIn.texCoor).r; //??surface?????????? //surface color blend float tempV=surfValue/0.125f; int intPart=(int)floor(tempV); float floatPart=frac(tempV); float3 detailMix; switch(intPart) { case 0: { detailMix=lerp(texD_0,texD_1,floatPart); float3 wN_0=WaterNormal.Sample(SamTexture,(pIn.texCoor+WaveUVOffset0)*WaveUVRepeat).xyz*2-1; float3 wN_1=WaterNormal.Sample(SamTexture,(pIn.texCoor-WaveUVOffset1)*WaveUVRepeat).xyz*2-1; float3 wN=normalize(wN_0+wN_1); wN=mul(wN,M33_TBN_To_M); wN=mul(wN,(float3x3)m44_V); float3 OkN=normalize(pIn.norView*0.7+wN*0.3); pOut.G1.xyz=OkN; } break; case 1: detailMix=lerp(texD_1,texD_2,floatPart); break; case 2: detailMix=lerp(texD_2,texD_3,floatPart); break; case 3: detailMix=lerp(texD_3,texD_4,floatPart); break; case 4: detailMix=lerp(texD_4,texD_5,floatPart); break; case 5: detailMix=lerp(texD_5,texD_6,floatPart); break; case 6: detailMix=lerp(texD_6,texD_7,floatPart); break; case 7: detailMix=lerp(texD_7,texD_8,floatPart); break; case 8: detailMix=texD_8; break; } float3 diffTex=txDiff.Sample(SamTexture,pIn.texCoor).rgb; float rateOfDiffTex=saturate((pIn.posView.z-detailMinMax.x)/(detailMinMax.y-detailMinMax.x)); pOut.G0.xyz=lerp(detailMix,diffTex,rateOfDiffTex);// pOut.G0.w=1.0;//alpha pOut.G2=pIn.posView; pOut.G2.w=intPart;//??ID return pOut; } /////////////////////////////////////////////////// BlendState NoBlend { BlendEnable[0] = FALSE; }; DepthStencilState dsState { DepthFunc = LESS_EQUAL; DepthEnable = TRUE; DepthWriteMask =1; }; //RasterizerState rsSolid //{ //FillMode = Solid; //CullMode = 3; //}; technique10 main { pass P0 { SetVertexShader( CompileShader( vs_4_0, VS_Main() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, PS_Main() ) ); SetDepthStencilState(dsState, 0); // SetRasterizerState(rsSolid); SetBlendState( NoBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); } } technique10 Lighting { pass P0 { SetVertexShader( CompileShader( vs_4_0, VS_Light() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, PS_Light() ) ); } }
  4. Thanks for your reading!   the G buffer defined like this R16 ---------G16----------B16---------A16                 {colorR}        {colorG}        {colorB}         {alpha}                            {norR}        {norG}            {norB}         {glow}                            {posR}        {posG}            {posB}         {matID}                              Z's format is DXGI_FORMAT_R32_TYPELESS. Z is not compute manully    m_pDevice->OMSetRenderTargets(3,pGBuffer->ppRTV,pGBuffer->pZRT);     static mesh rendering code is here //these codes show how to Rendering static mesh To GBuffer //Rendering terrain is similer to it; float4x4 gV:VIEW; float4x4 gWV:WORLDVIEW; float4x4 gWVP:WORLDVIEWPROJ; Texture2D diffTex:DIFFUSETEX; Texture2D specTex:SPECULARTEX;//not used Texture2D glowTex:GLOWTEX;//not used Texture2D norTex: NORTEX;//not used //some state BlendState noBlend { BlendEnable[0] = TRUE; }; BlendState NoBlend { BlendEnable[0] = FALSE; }; DepthStencilState dsState { DepthFunc = LESS_EQUAL; DepthEnable = TRUE; DepthWriteMask =1; }; RasterizerState rState { FillMode = Solid; CullMode = 3; }; SamplerState defaultSam { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; }; struct VS_IN { float4 posL: POSITION; float3 nor: NORMAL; float2 texCoor:TEXCOORD; }; struct PS_IN { float4 pos:SV_POSITION; float3 nor:NORMAL; float2 texCoor:TEXCOORD0; float4 posView:TEXCOORD1; }; struct PS_OUTPUT { float4 G0 : SV_Target0;//xyz=diffuse, w=alpha float4 G1 : SV_Target1;//xyz=norInView,w=glow float4 G2: SV_Target2;//xyz=posInView , w=materail ID }; PS_IN VS(VS_IN vIn) { PS_IN pIn; pIn.pos=mul(vIn.posL,gWVP); pIn.posView=mul(vIn.posL,gWV); //When Rendering terrain ,I use" mul(vIn.nor,(float3x3)gV)," instead of gWV. //because terrain's height come from vertex texture displacement. //Using gV can avoid normal to be scaled pIn.nor=normalize(mul(vIn.nor,(float3x3)gWV)); pIn.texCoor=vIn.texCoor; return pIn; } PS_OUTPUT PS(PS_IN pIn) { PS_OUTPUT pOut =(PS_OUTPUT) 0.0; float4 colorSuface=diffTex.Sample(defaultSam,pIn.texCoor); if(colorSuface.w<0.5f) { clip(-1); } else { pOut.G0=colorSuface; pOut.G1=float4(pIn.nor,0); pOut.G1.w=0; pOut.G2=pIn.posView; pOut.G2.w=0; } return pOut; } technique10 DEFFERD_RENDER { pass P0 { SetVertexShader( CompileShader( vs_4_0, VS() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, PS() ) ); SetDepthStencilState(dsState, 0); SetRasterizerState(rState); SetBlendState(noBlend, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); } } In the stage of rendering to G, fx was used. In the stage of "G to backBuffer" ,I'm not using fx but the individual vertexShader and pixelShader.   In the 2nd stage ,I found that when i use the function "mul(gV_Invert,float4(posInView,1.0))", the vertex can't tranformd to world space..does this make SSAO failure?
  5. i was try to get ssao. but get the  bad result .please tell me where the wrong is,thank you. (~~forgive my poor English spelling)   here is the screen shot   ssao: (if i changed some parameters ,the screen divided to 4x4 part) [attachment=17840:texS.jpg]   normal [attachment=17838:SN.jpg]   tex [attachment=17839:tex.jpg]   //////////////////////////////////////////////////////////////// //here is the main ps code: float4 main(PS_IN pIn):SV_TARGET { //view space position float3 posInView=GetViewPos(pIn.texCoor); //view space deepth float deep=posInView.z; // vectors in a sphere,we get the scaler by deepth float SphereR=GetSamRadius(deep); //view space normal, //(when render to G buffer ,i did not uniform normal to 0.0-1.0) float3 n=gBuff_1.Sample(Sam_Point_Warp,pIn.texCoor).xyz; int sampleCount=32; float ssaoRate=0; for(int idx=0;idx<sampleCount;++idx) { //Get a random vector float3 ranVec3=randVec[idx]; //reflect the random vector by a noise texture ranVec3=normalize(RefByNoise(pIn.texCoor,ranVec3)); //flip the vector if it is in the down sphere if(dot(n,ranVec3)<0) { ranVec3=-ranVec3; } //scale the vector ranVec3=ranVec3*SphereR; //find the pos witch need to be sampled float3 posForSample=posInView+ranVec3; //get UV float2 uvForSample=viewPosToUV(posForSample); //get Real pos float3 viewPosInScene=GetViewPos(uvForSample); ssaoRate+=SSAO(posForSample,viewPosInScene,posInView,SphereR); } ssaoRate/=sampleCount; ssaoRate=1-ssaoRate; return float4(ssaoRate,ssaoRate,ssaoRate,1); } /////////////////////////// here are some decls and functions(in the shader file ,these codes are on the top) //AOScanDis means the rate of screen wide //for example : AOScanDis=0.1 ,screen wide=1024 ,we will sample within 102 pixel float GetSamRadius(float distance) { return tanH_FOV*distance*2.0*AOScanDis; } float3 GetRefVec3(in float3 ray,in float3 n) { return ray-2*n*dot(n,ray); } float3 RefByNoise(float2 UV,float3 vec) { float2 targUV=(float2) 0; targUV.x=UV.x*GBufferWH.x/NorTexSize; targUV.y=UV.y*GBufferWH.y/NorTexSize; float3 noiseVec=gRefNosize.Sample(Sam_Point_Warp,targUV).xyz*2-1; return GetRefVec3(vec,noiseVec); } float3 GetViewPosFromZ(float2 UV) { float p=zBuffer.Sample(Sam_Point_Warp,UV).x; } float3 GetViewPos(float2 UV) { return gBuff_2.Sample(Sam_Point_Warp,UV).xyz; } //convert view pos to uv coord float2 viewPosToUV(float3 p) { //1. convert projection to the plane where z=1 p.xy=p.xy/p.z; //get half size of wide and height, tanH_FOV=tan(half size of camera horizontal angle) float w=tanH_FOV; float h=BackBufferWH.y/BackBufferWH.x*w; //Get Length rate p.x=p.x/w; p.y=p.y/h; //transform camera xy to texture uv float2 UV=(float2)0; UV.x=p.x*0.5+0.5; UV.y=-p.y*0.5+0.5; return UV; } //1st prama : pos for sample //2nd: the real view pos //3rd: center pos //4th: Radius float SSAO(float3 pS,float3 pR,float3 pC,float sphereR) { if(pS.z>pR.z) { float occDis=length(pR-pC); if(occDis<=AOep) { return 0; } else { return max((1-pow((occDis-AOep)/sphereR,AOIntensity)),0); } } else { return 0; } } /////////////////////////////////////////////// cbuffer texPP:register(b1) { float2 UVBlurBufferWH; float2 BackBufferWH; float2 GBufferWH; float2 fTimeMtime; float2 value; float AOScanDis; float tanH_FOV; float AOEp;//if distance less than AOEp ,no AO occured float AOIntensity; float NorTexSize; } struct PS_IN { float4 pos:SV_POSITION; float2 texCoor:TEXCOORD0; }; Texture2D gBuff_0 : register( t0 );//Texture Texture2D gBuff_1 : register( t1 );//Normal Texture2D gBuff_2 : register( t2 );//Position Texture2D zBuffer : register( t3 );//Depth Texture2D gRefNosize: register( t4 ); SamplerState Sam_Point_Warp: register(s0);