游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1562|回复: 1

uniform参数放在全局和main参数中的区别导致错误

[复制链接]

16

主题

88

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2010-3-27 17:11:00 | 显示全部楼层 |阅读模式

很简单的一个代码:
  1. //uniform float4x4 uModelViewProj;

  2. void main( float4 Position : POSITION,
  3.            float4 Normal : NORMAL,
  4.            out float4 oPosition : POSITION,
  5.            out float4 oColor    : COLOR
  6.            , uniform float4x4 uModelViewProj )
  7. {
  8.         int a = 100;
  9.         oPosition = mul( Position, uModelViewProj );       

  10.         oColor.x = 1.0;
  11.         oColor.y = 0.0;
  12.         oColor.z = 0.0;
  13.         oColor.w = 0.5;
  14. }         
复制代码


如果uModelViewProj放在参数里面,则什么都看不到。如果放在全局,把参数中的uModelViewProj的注掉,那么就正常了。

产生顶点的程序代码:

  1. HRESULT InitGeometry()
  2. {
  3.         //创顶点缓冲区
  4.         if( FAILED( g_pd3dDevice->CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX),
  5.                 0, D3DFVF_CUSTOMVERTEX,
  6.                 D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
  7.         {
  8.                 return E_FAIL;
  9.         }

  10.         //填充顶点缓冲区
  11.         CUSTOMVERTEX* pVertices;
  12.         if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) )
  13.                 return E_FAIL;
  14.         for( DWORD i=0; i<50; i++ )
  15.         {
  16.                 FLOAT theta = (2*D3DX_PI*i)/(50-1);
  17.                 pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );
  18.                 pVertices[2*i+0].normal   = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );
  19.                 pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );
  20.                 pVertices[2*i+1].normal   = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );
  21.         }
  22.         g_pVB->Unlock();

  23.         LPD3DXBUFFER pCode = NULL;
  24.         LPD3DXBUFFER pErrorMsg = NULL;
  25.         if( FAILED( ::D3DXCompileShaderFromFile( L"SimpleLight_v.cg", NULL, NULL,
  26.                 "main", "vs_2_0", D3DXSHADER_SKIPOPTIMIZATION|D3DXSHADER_DEBUG,
  27.                 &pCode,
  28.                 &pErrorMsg, &g_pConstantTable_VS ) )
  29.                 )
  30.         {
  31.                 ::MessageBoxA( NULL, (const char*)pErrorMsg->GetBufferPointer(), "error", 0 );

  32.                 ::PostQuitMessage(0);
  33.                 return FALSE;
  34.         }

  35.         if( FAILED( g_pd3dDevice->CreateVertexShader(
  36.                 (DWORD*)pCode->GetBufferPointer(), &g_pVertexShader) ) )
  37.         {
  38.                 ::MessageBoxA( NULL, "Error2!!!", "error", 0 );

  39.                 ::PostQuitMessage(0);
  40.                 return FALSE;
  41.         }

  42.         assert( g_pConstantTable_VS != NULL );
  43.         assert( g_pVertexShader != NULL );

  44.         pCode->Release();


  45.         //设置变换矩阵
  46.         SetMatrices();

  47.         return S_OK;
  48. }
复制代码


设置矩阵的代码;

  1. VOID SetMatrices()
  2. {
  3.         //建立并设置世界矩阵
  4.         D3DXMATRIX matWorld;
  5.         D3DXMatrixIdentity( &matWorld );

  6.         //建立并设置观察矩阵
  7.         D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );
  8.         D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
  9.         D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
  10.         D3DXMATRIX matView;
  11.         D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );

  12.         //建立并设置投影矩阵
  13.         D3DXMATRIX matProj;
  14.         D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );

  15.         assert( g_pConstantTable_VS != NULL );

  16.         D3DXMATRIXA16 matModelViewProj = matWorld*matView*matProj;
  17.         g_pConstantTable_VS->SetMatrix( g_pd3dDevice, "uModelViewProj", &matModelViewProj );
  18. }
复制代码


效果区别图:

16

主题

88

帖子

102

积分

注册会员

Rank: 2

积分
102
 楼主| 发表于 2010-3-27 17:11:00 | 显示全部楼层

Re:uniform参数放在全局和main参数中的区别导致错误

无法上传图片,区别就是能不能看见那些顶点,谢谢大家。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-10 10:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表