`
isiqi
  • 浏览: 16556377 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

HLSL的一些见解

阅读更多

研究HLSL也有些日子了,其中犯了很多错误,现将沿途所遇略作纪录,以次时刻提醒自己不要重蹈覆辙。

1. Effect文件(.fx)是标准格式,要妥善利用其接口与应用程序通讯,理解语意(Semantic)和注释(Annoation)是关键。


2. HLSL指令集要倒背如流,切不可做出重写标准库的蠢事,当初我就写了一个distance函数来求距离,熟不知标准库里早有这个函数,仔细一研究,标准库里不仅支持三维向量,其它的诸如二维也以考虑在内,汗^_^,完整的指令集可以参见DX帮助文件,路径为DirectX Graphics->HLSL->Reference->Intrinsic Functions

3. 不仅指令既要倒背如流,还要注意指令的限制,尤其是Shader ModelSM),像ddxddy这样的指令是不能用在Shader Model 1 中的,这个我感觉是比较令人沮丧的事情,程序员的代码和逻辑都正确,却限制于硬件配置的问题,还好现在硬件发展迅速,SM3.0甚至SM4.0的显卡都已经进入主流市场,这些限制会逐渐消失的。具体的限制可以查看DirectX Graphics->HLSL->Reference-> Shader Models

4. 编译Effect的时候能用低配置的Profile就用低的,举例来说能用vs_1_1的就不要用vs_2_0ps也是一样的道理,Profile选的越低,你的Effect兼容性就越好,如果不分清楚直接就用最高Profile,到了客户那因为显卡配置不够报错的概率就大了,至少我现在还没听说某款PC游戏只能在SM4.0下才能用,游戏机,测试程序自然不算了,以后没准等SM5.0都普及的时候,我这话也自然过时了^_^

5. VS中计算屏幕坐标时要把坐标先转换成齐次坐标

a) 这样写是有问题的,mul(input.Position, WorldViewTransform);

b) 要改成mul(float4(input.Position,1), WorldViewTransform);

6. 文件最后一行要在最后加一个空格或一个空行,要不有时会有error X3000: syntax error: unexpected end of file,这样的错误信息,这种错误信息有时莫明其妙发生,例如在加了一条注释后,总之是在编写Effect的时候要格外小心谨慎。

7. 前几天还遇到了这样的错误,在ps中写了个if语句返回某种颜色,不料产生错误,错误信息如下error X3500: asymetric returns from if statements not yet implemented。现在把Effect文件内容张帖出来,为了搞清楚问题本质,我把不相关代码全部删除了,只留下必要地解释性代码。一开始没注意看错误信息,以为是那里写错了,就几十行代码折腾半天不见好转,后来仔细看错误信息后才恍然大悟,原来是Effect编译器不支持这种if用法,虽然HLSL支持以c的语法来写shader,但毕竟和c还是有区别的,编译下面的代码就会得到上述错误信息,只要在第二个return前加else,使其成为一个ifelse结构,编译自然通过。由此可见,写shaderc的观念在某些情况下要转变过来,如果一味以c的直观印象去评测,极有可能出现问题。

1 //默认效果文件
2
3 boolflag=true;
4
5 float4PS(float2pos:TEXCOORD0):COLOR
6 {
7 if(flag)
8 returnfloat4(1,1,1,1);
9 returnfloat4(0,0,0,1);
10 }
11
12 techniqueSpecular20
13 {
14 passP0
15 {
16 PixelShader=compileps_2_0PS();
17 }
18 }

以上几点皆为个人经验小节,以后遇到再做补充,某些可能还有问题,不足之处请指出共勉。文章中提到的Effect文件可以在这里下载。/Files/gogoplayer/HLSL/Test.rar

分享到:
评论

相关推荐

    hlsl2glsl hlsl转换为glsl图形化工具

    hlsl2glsl-v0.9版本可能是该工具的一个稳定发布,它可能包含了一些关键的改进和修复,以确保转换过程的准确性和兼容性。使用这样的工具,开发者可以将原本为Direct3D设计的着色器代码轻松转换为OpenGL兼容的形式,而...

    HLSL基础教程 DirectX

    - 提供了一些预定义的效果,如基本的光照模型、纹理映射等,但缺乏灵活性。 - **可编程管线**: - 允许用户编写自己的着色器代码来实现复杂的图形效果。 - 分为两个主要阶段:顶点处理(Vertex Processing)和像素...

    HLSL初级教程 内含代码

    在IT领域,High-Level Shader Language(HLSL)是一种专门用于图形编程的着色语言,由微软开发,主要用于DirectX应用程序中的图形渲染。HLSL是程序员与图形硬件交互的重要工具,尤其在游戏开发和实时渲染领域应用...

    HLSL Development Cookbook.pdf

    ### HLSL Development Cookbook 关键知识点概述 #### 一、HLSL与DirectX11简介 - **HLSL(High-Level Shading Language)**:一种由微软开发的高级着色语言,主要用于编写运行在DirectX环境下的着色器程序。HLSL的...

    HLSL基础教程中文版

    HLSL基础教程中文版 HLSL(High-Level Shading Language 高级着色语言)是一种高级着色语言,用于编写着色器(Shader)。...学习HLSL需要具备基本的DirectX和Direct3D知识,并具备一些3D渲染技术的基础知识。

    HLSL语言编程实例

    HLSL,全称为High-Level Shader Language,是微软为DirectX图形API开发的一种着色器语言。它主要用于编写GPU上的程序,特别是在图形渲染、计算密集型任务和游戏开发中发挥着重要作用。本资源集合提供了丰富的HLSL...

    HLSL的VS工具

    HLSL的VS工具

    HLSL 初级教程.pdf

    "HLSL 初级教程.pdf" 本教程旨在帮助初学者快速理解 HLSL 编程的概念和方法,从应用的角度对 HLSL、顶点着色器、像素着色器和 Effect 效果框架进行了介绍。 什么是着色器 着色器是一种可以在 GPU 上执行的程序,...

    一个简单的HLSL例程

    HLSL(High-Level Shader Language)是微软为Direct3D图形接口开发的一种着色语言,用于编写图形渲染的着色器程序。在这个“一个简单的HLSL例程”中,我们可能涉及到以下几个关键知识点: 1. **HLSL概述**:HLSL是...

    HLSL特效 详细讲解shade

    HLSL(High-Level Shader Language)是微软为Direct3D开发的一种高级着色语言,用于GPU编程,特别是在图形渲染和图像处理中。它允许开发者创建复杂的光照、纹理和动画效果,提升图形表现力。 1: HLSL概述 HLSL是专...

    hlsl fx特效演示

    **hlsl与fx特效演示详解** hlsl,全称High-Level Shader Language,是DirectX中的高级着色器语言,由微软开发,用于图形渲染领域的编程。hlsl是为图形程序员设计的一种专用语言,允许他们创建复杂的图形效果和计算...

    HLSL 入門教學

    ### HLSL 入門教學知识点解析 #### 一、HLSL基础知识 ##### 1.1 什么是着色器? 着色器是一种专门用于图形渲染的程序,可以在GPU上执行,用于控制图形如何被渲染。根据其作用的不同,着色器可以分为多种类型,如...

    最新HLSL内置函数

    在HLSL中,一些常见的内置函数有: 1. 数学函数:如`abs`(绝对值)、`acos`(反余弦)、`asin`(反正弦)、`atan`(反正切)、`cos`(余弦)、`cosh`(双曲余弦)、`ceil`(向上取整)、`clamp`(限制范围)、`...

    在OGRE中使用HLSL.txt

    ### 在OGRE中使用HLSL #### 一、OGRE与HLSL简介 OGRE(Object-Oriented Graphics Rendering Engine)是一款免费且开源的3D渲染引擎,旨在为开发者提供高性能、高质量的3D图形渲染解决方案。HLSL(High-Level ...

    hlsl流动云彩效果

    【hlsl流动云彩效果】是一种使用高级着色语言(High-Level Shader Language,简称hlsl)来实现的视觉特效,常见于3D游戏和虚拟环境中。hlsl是DirectX的一部分,专为图形处理单元(GPU)设计,允许开发者编写自定义的...

    XNA中的HLSL简单应用

    在XNA游戏开发框架中,High-Level Shader Language (HLSL)是一种强大的着色语言,用于编写图形处理单元(GPU)执行的着色器。HLSL被用来增强游戏的视觉效果,通过自定义顶点、像素等着色器来控制图形的渲染。在本文中...

    Packt.HLSL Development Cookbook.2013

    以下是本书可能涵盖的一些关键知识点: 1. **HLSL基础**:介绍HLSL的基本语法,包括变量声明、数据类型、运算符以及控制流语句,让读者对HLSL有一个初步的认识。 2. **颜色和纹理处理**:讲解如何使用HLSL处理颜色...

    HLSL Pixel Shader-Chinese

    在计算机图形学领域,HLSL(High-Level Shader Language)是一种强大的着色语言,由微软为DirectX设计,用于编写图形处理单元(GPU)上的着色器程序。在这个主题中,我们将深入探讨“HLSL Pixel Shader”以及如何...

    HLSL程序入门03

    在进入HLSL(High-Level Shader Language)程序的深度学习之前,我们首先需要理解HLSL的基本概念。HLSL是一种专门针对微软DirectX图形接口的着色语言,用于编写图形处理单元(GPU)上的计算代码,从而实现复杂的图形...

    HLSL-and-Pixel-Shaders-for-XAML-Developers_HLSL_

    以下是关于HLSL和像素着色器的一些详细知识点: 1. **HLSL简介**:HLSL是Microsoft为DirectX设计的一种着色语言,旨在提供高性能的图形编程能力。它支持浮点运算,能处理复杂的数学和物理计算,以及图形渲染中的...

Global site tag (gtag.js) - Google Analytics