游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2239|回复: 3

关于HLSL获取着色器中常量的问题

[复制链接]

8

主题

121

帖子

133

积分

注册会员

Rank: 2

积分
133
QQ
发表于 2010-1-18 21:45:00 | 显示全部楼层 |阅读模式
本人最近封装了DX中关于着色器的代码,代码如下:
void ShaderPipe:oadShader(LPCSTR shaderPath,/*着色器文件路径*/
                         LPCSTR importFunName,/*着色器入口函数名*/
                         int type/*着色器类型,0为默认顶点着色器, 1为像素着色器*/)
{
        //编译着色器文件
        HRESULT hr = D3DXCompileShaderFromFile(shaderPath, 0, 0,
                                                   importFunName, "vs_2_0",D3DXSHADER_DEBUG,&m_compiledCode,
                                                  &m_error, &m_contantTable);
        if(m_error)
        {
                ::MessageBox(NULL, (char*)m_error->GetBufferPointer(), "ShaderPipe Error", MB_OK);
                //d3d::Release<ID3DXBuffer*>(m_error);
                delete m_error;
                m_error = NULL;
        }

        if(FAILED(hr))
        {
                ::MessageBox(NULL, "Compile Shader failed!", "ShaderPipe Error", MB_OK);
        }

        //创建顶点着色器
        if(!type)
        {
                hr = m_device->CreateVertexShader((DWORD*)m_compiledCode->GetBufferPointer(), &m_vertexshader);
                if(FAILED(hr))
                {
                        ::MessageBox(NULL, "Create VertexShader failed!", "ShaderPipe Error", MB_OK);
                        delete m_compiledCode;
                        m_compiledCode = NULL;
                }
        }
        //创建像素着色器
        else
        {
                hr = m_device->CreatePixelShader((DWORD*)m_compiledCode->GetBufferPointer(), &m_pixelshader);
                if(FAILED(hr))
                {
                        ::MessageBox(NULL, "Create PixelShader failed!", "ShaderPipe Error", MB_OK);
                        delete m_compiledCode;
                        m_compiledCode = NULL;
                }
        }
}


/*设置当前加载的着色器到渲染管道*/
void ShaderPipe::UseShader(int type)
{
        if(!type)
                m_device->SetVertexShader(this->m_vertexshader);
        else
                m_device->SetPixelShader(this->m_pixelshader);
}


/*通过名字访问变量*/
D3DXHANDLE ShaderPipe::GetConstantByName(LPCSTR varName, /*变量名称*/
                                                                                 D3DXHANDLE handle/*变量的父结构*/)
{
        constantVar = m_contantTable->GetConstantByName(handle, varName);
        if(!constantVar)
        {
                char str[50];
                sprintf(str,"Can't get constantVar '%s'",varName);
                ::MessageBox(NULL,str, "ShaderPipe Error", MB_OK);
        }

        return constantVar;
}


但是使用加载着色器之后,调用ShaderPipe::GetConstantByName方法获取着色器中的常量总是返回为空值,请问大家,上述代码中有什么问题吗?本人检查了很久,未能找出问题所在

8

主题

121

帖子

133

积分

注册会员

Rank: 2

积分
133
QQ
 楼主| 发表于 2010-1-19 09:18:00 | 显示全部楼层

Re:关于HLSL获取着色器中常量的问题

怎么没有人帮忙解答一下呢?

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2010-1-19 16:14:00 | 显示全部楼层

Re:关于HLSL获取着色器中常量的问题

太长懒得看。只是有EffectFrame了你为啥还要封底层shader.

8

主题

121

帖子

133

积分

注册会员

Rank: 2

积分
133
QQ
 楼主| 发表于 2010-1-20 14:08:00 | 显示全部楼层

Re:关于HLSL获取着色器中常量的问题

为了一步步学习而已,你不是来解答问题的么?是来质问我为什么会遇到这样问题的啊!~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-16 00:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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