• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 94, comments - 250, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            Nebula3繪制2D紋理

            Posted on 2008-12-14 22:03 Condor 閱讀(2100) 評(píng)論(1)  編輯 收藏 引用

            上次已經(jīng)繪制過基本圖元了, 這次只不過要貼張圖而已.....

            本來我想用Graphics的Model渲染流程來做, 不過這一層太高級(jí)了, 都是什么場景管理資源映射之類的

            做低級(jí)的事情, 就要用低級(jí)的API嘛

            圖形渲染的底層是CoreGraphics, 這個(gè)層我不打算再單獨(dú)寫(翻譯)一篇了, 因?yàn)槎际荄irect3D概念的一些抽象. 也就是說D3D用熟了基本上一看就明白(用GL的我就不清楚啦, 嘿嘿, N3的作者都放棄用GL去實(shí)現(xiàn)@_@).

            還記得D3D Tutorial中的Textured例子不? 需要的東西有帶紋理坐標(biāo)的點(diǎn), 紋理. N3中也一樣, 不過, 這里沒法用固定管線了.

            N3的設(shè)計(jì)的時(shí)候就放棄了固定管線(多么明智呀, 別噴我-_-, 我只會(huì)shader.......), 所以在這之前我們要先寫一個(gè)shader來進(jìn)行繪制.

            因?yàn)槲覀冎皇沁M(jìn)行簡單的演示, 就盡量簡單了, 寫一個(gè)2D的紋理繪制, 你可以用來做UI:

            1. //------------------------------------------------------------------------------
            2. //  texture2d.fx
            3. //  texture shader for 2D(UI)
            4. //  (C) xoyojank
            5. //------------------------------------------------------------------------------
            6. float2 halfWidthHeight  : HalfWidthHeight;
            7. texture diffMap     : DiffMap0;
            8. sampler diffMapSampler = sampler_state
            9. {
            10.     Texture = <diffMap>;
            11.     AddressU = Clamp;
            12.     AddressV = Clamp;
            13.     MinFilter = Point;
            14.     MagFilter = Point;
            15.     MipFilter = None;
            16. };
            17. struct VS_INPUT
            18. {
            19.     float3 pos  : POSITION;
            20.     float2 uv       : TEXCOORD;
            21. };
            22. struct VS_OUTPUT
            23. {
            24.     float4 pos  : POSITION;
            25.     float2 uv       : TEXCOORD;
            26. };
            27. //------------------------------------------------------------------------------
            28. /**
            29. */
            30. VS_OUTPUT
            31. VertexShaderFunc(VS_INPUT input)
            32. {
            33.     VS_OUTPUT output;
            34.     output.pos.xy = float2(input.pos.x - halfWidthHeight.x, halfWidthHeight.y - input.pos.y) / halfWidthHeight;
            35.     output.pos.zw = float2(input.pos.z, 1.0f);
            36.     output.uv = input.uv;
            37. return output;
            38. }
            39. //------------------------------------------------------------------------------
            40. /**
            41. */
            42. float4
            43. PixelShaderFunc(float2 uv : TEXCOORD0) : COLOR
            44. {
            45. return tex2D(diffMapSampler, uv);
            46. }
            47. //------------------------------------------------------------------------------
            48. /**
            49. */
            50. technique Default
            51. {
            52.     pass p0
            53.     {
            54.         ColorWriteEnable  = RED|GREEN|BLUE|ALPHA;
            55.         ZEnable           = False;
            56.         ZWriteEnable      = False;
            57.         StencilEnable     = False;
            58.         FogEnable         = False;
            59.         AlphaBlendEnable  = True;
            60.         SrcBlend          = SrcAlpha;
            61.         DestBlend         = InvSrcAlpha;
            62.         AlphaTestEnable   = False;
            63.         ScissorTestEnable = False;
            64.         CullMode          = CW;        
            65.         VertexShader = compile vs_3_0 VertexShaderFunc();
            66.         PixelShader = compile ps_3_0 PixelShaderFunc();
            67.     }
            68. }

            值得一提的是CullMode = CW, 為什么? 因?yàn)镹3用的右手坐標(biāo)系, 這點(diǎn)又跟D3D不一樣了........為什么呢? 難道寫MAYA跟MAX的插件的時(shí)候比較省事?

            還是要跟上一次一樣設(shè)置頂點(diǎn)格式并載入VertexBuffer:

            1. // vertex
            2.             Array<VertexComponent> vertexComponents;
            3.             vertexComponents.Append(VertexComponent(VertexComponent::Position, 0, VertexComponent::Float3));
            4.             vertexComponents.Append(VertexComponent(VertexComponent::TexCoord, 0, VertexComponent::Float2));
            5. float vertex[4][5] = {
            6.                 {0.0f,  0.0f,   0.0f,   0.0f, 0.0f},
            7.                 {0.0f,  256.0f, 0.0f,   0.0f, 1.0f}, 
            8.                 {256.0f,0.0f,   0.0f,   1.0f, 0.0f}, 
            9.                 {256.0f,256.0f, 0.0f,   1.0f, 1.0f}
            10.             };
            11.             vertexBuffer = VertexBuffer::Create();
            12.             Ptr<MemoryVertexBufferLoader> vbLoader = MemoryVertexBufferLoader::Create();
            13.             vbLoader->Setup(vertexComponents, 4, vertex, 4 * 5 * sizeof(float));
            14.             vertexBuffer->SetLoader(vbLoader.upcast<ResourceLoader>());
            15.             vertexBuffer->Load();
            16.             vertexBuffer->SetLoader(NULL);

            紋理的創(chuàng)建其實(shí)跟頂點(diǎn)差不多, 因?yàn)樗际菍儆谫Y源的一種, 詳見Nebula3資源子系統(tǒng)

            1. // texture
            2.             texture = Texture::Create();
            3.             texture->SetResourceId(ResourceId("bin:razor.jpg"));
            4.             texture->SetLoader(StreamTextureLoader::Create());
            5.             texture->Load();
            6.             texture->SetLoader(NULL);

            shader的加載跟上一次一樣, 只是參數(shù)不同:

            1. // shader
            2. this->shaderInstance = this->shaderServer->CreateShaderInstance(ResourceId("shd:texture2d"));
            3.             Ptr<ShaderVariable> halfWidthHeight = this->shaderInstance->GetVariableBySemantic(ShaderVariable::Semantic("HalfWidthHeight"));
            4.             float2 halfWH = float2(this->renderDevice->GetDefaultRenderTarget()->GetWidth(), this->renderDevice->GetDefaultRenderTarget()->GetHeight()) * 0.5f;
            5.             halfWidthHeight->SetFloatArray(&halfWH.x(), 2);
            6.             Ptr<ShaderVariable> diffMap = this->shaderInstance->GetVariableBySemantic(ShaderVariable::Semantic("DiffMap0"));
            7.             diffMap->SetTexture(texture);

            繪制嘛, 當(dāng)然改成矩形了, 圖片可貼不到一跟線上:

            1. this->renderDevice->BeginFrame();
            2. this->renderDevice->BeginPass(this->renderDevice->GetDefaultRenderTarget(), this->shaderInstance);
            3.         PrimitiveGroup primGroup;
            4.         primGroup.SetBaseVertex(0);
            5.         primGroup.SetNumVertices(4);
            6.         primGroup.SetPrimitiveTopology(PrimitiveTopology::TriangleStrip);
            7. this->renderDevice->SetVertexBuffer(this->vertexBuffer);
            8. this->renderDevice->SetPrimitiveGroup(primGroup);
            9. this->renderDevice->Draw();
            10. this->renderDevice->EndPass();
            11. this->renderDevice->EndFrame();
            12. this->renderDevice->Present();

            上圖:

            Feedback

            # re: Nebula3繪制2D紋理  回復(fù)  更多評(píng)論   

            2008-12-15 11:39 by saltyshrimp
            樓主這些是轉(zhuǎn)載吧?轉(zhuǎn)載的時(shí)候說明一下,或者把原文的鏈接也放上來吧

            只有注冊用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            亚洲国产精品无码久久久不卡| 久久伊人影视| 精品久久久噜噜噜久久久| 久久天天躁狠狠躁夜夜96流白浆| 欧洲精品久久久av无码电影| 国产精品久久久久久| 亚洲国产香蕉人人爽成AV片久久 | 久久久青草久久久青草| 色综合久久88色综合天天| 国产精品亚洲综合久久| 久久精品亚洲精品国产色婷| 久久久久97国产精华液好用吗| 日韩人妻无码精品久久免费一| 日韩亚洲欧美久久久www综合网| 理论片午午伦夜理片久久| 国产精品99久久99久久久| 亚洲国产精品无码久久九九| 久久福利青草精品资源站| 亚洲色婷婷综合久久| 欧美激情精品久久久久久久九九九 | 久久国产精品二国产精品| 久久精品午夜一区二区福利| 要久久爱在线免费观看| 国产免费久久久久久无码| 狠狠久久亚洲欧美专区| www久久久天天com| 久久精品国产第一区二区三区 | 久久er99热精品一区二区| 亚洲国产美女精品久久久久∴ | 久久强奷乱码老熟女网站| 久久久久久一区国产精品| 国产高潮久久免费观看| 91久久精品视频| 天天爽天天爽天天片a久久网| 久久AV高清无码| 国产人久久人人人人爽| 精品人妻久久久久久888| 国产人久久人人人人爽| 久久香蕉国产线看观看乱码| 国产精品久久国产精品99盘| 久久本道伊人久久|