阅读GLSL 1.40规范:
片段输出只能是浮点,浮点矢量,有符号或无符号整数或整数向量,或任何这些的数组.无法输出矩阵和结构.片段输出在以下示例中声明:
out vec4 FragmentColor; out uint Luminosity;
片段颜色定义为写gl_FragColor ...是不是?有人可以清楚我对这些产出的看法吗?我可以只编写示例中的'FragmentColor'来确定片段颜色吗?我可以回读一下(比如'Luminosity')吗?
我想尝试一下OpenGL ES 2.0编程指南中的照明示例.在着色器中,他们制作了两个结构.
struct directional_light
{
vec3 direction; // normalized light direction in eye space
vec3 halfplane; // normalized half-plane vector
vec4 ambient_color;
vec4 diffuse_color;
vec4 specular_color;
};
struct material_properties
{
vec4 ambient_color;
vec4 diffuse_color;
vec4 specular_color;
float specular_exponent;
};
Run Code Online (Sandbox Code Playgroud)
他们还根据这些结构制作了两件制服.
uniform material_properties u_material_properties;
uniform directional_light u_directional_light;
Run Code Online (Sandbox Code Playgroud)
问题是,我不知道如何将自己的结构传递给实际的着色器.
我想在我的主代码中创建相同的结构,并将对象传递到着色器.这怎么可能?
关心尼克拉斯
已知分支在OpenGL ES着色器中特别具有计算成本.在这样的着色器中,我在除以之前检查值是否为null,例如:
if(value == 0.0)
other_value = 0.0;
else
other_value = 1.0 / value;
Run Code Online (Sandbox Code Playgroud)
为了加快速度,我想if通过直接做到这一点来避免这种情况:
other_value = 1.0 / value;
Run Code Online (Sandbox Code Playgroud)
我想知道如果value碰巧等于0会发生什么,这在我的治疗中有点罕见,这就是为什么测试它并不容易.着色器是否会崩溃?应用程序崩溃了吗?
我几天前找到了Gwen,认为它看起来像是我项目的完美GUI工具包.但是哦,亲爱的,看一下渲染器中的所有OpenGL 2代码.所以我以为我会写一个OpenGL 3渲染器,所以我可以实际使用它,但我比CG更熟悉CG而且我已经让自己陷入了编写样本的困境.我想如果我能够设置这些统一变量,它应该基本完成.
着色器编译和链接没有问题.我把它缩小到glGetUniformLocation,为正交矩阵和纹理采样器返回-1,但我不知道为什么它正在这样做.典型的问题似乎是,如果你实际上没有使用它们,它们会被优化出来,但我已经将它们用于两者.
如果有人有任何想法,我会全力以赴.一旦它正常工作,将非常乐意发布/链接完整的东西.这是我对GLSL的第一次尝试,所以我很容易做一些愚蠢的事情.我刚刚完成为另一个项目设置CG,所以我不是完全无能为力.
设置OpenGL上下文后调用Shader Init代码:
void InitializeShaders(void)
{
g_ShaderProgram = glCreateProgram();
g_VertexShader = glCreateShader(GL_VERTEX_SHADER);
g_FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(g_VertexShader, 1, (const GLchar **)&VertexShaderData, 0);
glShaderSource(g_FragmentShader, 1, (const GLchar **)&FragmentShaderData, 0);
glCompileShader(g_VertexShader);
CheckShaderCompile(g_VertexShader);
glCompileShader(g_FragmentShader);
CheckShaderCompile(g_FragmentShader);
glAttachShader(g_ShaderProgram, g_VertexShader);
glAttachShader(g_ShaderProgram, g_FragmentShader);
glBindAttribLocation(g_ShaderProgram, 0, "position");
glBindAttribLocation(g_ShaderProgram, 1, "color");
glBindAttribLocation(g_ShaderProgram, 2, "texCoord");
glBindFragDataLocation(g_ShaderProgram, 0, "color");
glLinkProgram(g_ShaderProgram);
CheckShaderLink();
g_OrthoTransformLocation = glGetUniformLocation(g_ShaderProgram, "orthoTransform");
g_TextureLocation = glGetUniformLocation(g_ShaderProgram, "textureSampler");
}
Run Code Online (Sandbox Code Playgroud)
着色器作为字符串存储在头文件中,但我删除了所有换行符和反斜杠,因此它们看起来不那么痛苦.
顶点着色器:
#version 330
in vec4 position;
out vec4 outPosition;
uniform mat4x4 orthoTransform;
void main(void)
{ …Run Code Online (Sandbox Code Playgroud) 每当我将新的.fsh或.vsh OpenGL ES 2.0着色器文件添加到我的项目资源时,该文件就会被添加到不属于它的Compile Sources构建阶段.然后我必须从该阶段手动删除它,并手动将其添加到Copy Bundle Resources构建阶段.
有什么办法可以让Xcode自动将扩展名为.fsh和.vsh的文件添加到Copy Bundle Resources构建阶段吗?
或者是否可以创建与将着色器添加到Copy Bundle Resources构建阶段具有相同效果的构建规则?
我更喜欢一个适用于Xcode项目/工作区的所有用户的解决方案,而不是每个Xcode用户必须单独播放的设置或系统更改.
我正在为#version 130(OpenGL 3.0)编写一个GLSL着色器
它发出警告"在120版之后不推荐使用全局函数texture1D"
我用谷歌搜索但找不到多少.如果它过时了,那么什么应该我是使用提供类似的功能?
我在Three.js中创建了一个自定义几何体.现在,我想创建一个使用光滑阴影Lambert材质的网格.使用循环,我创建了顶点数组,然后是面,然后我调用了
geometry.computeCentroids();
geometry.computeFaceNormals();
geometry.computeVertexNormals();
var colorMaterial = new THREE.MeshLambertMaterial( {color: 0x0000ff, side: THREE.DoubleSide} );
var mesh = new THREE.Mesh( geometry, colorMaterial );
scene.add(mesh);
Run Code Online (Sandbox Code Playgroud)
结果几乎是完美的,除了看起来好像材料正在使用shading: THREE.FlatShading,如下所示:

虽然我期待一个人通常期望的默认外观shading: THREE.SmoothShading.我需要添加/更改以获得平滑的Lambert着色?
(如果有帮助,一个完整的实例是http://stemkoski.github.io/Three.js/Marching-Cubes.html,几何和网格是围绕250-280行创建的.)
我正在关注一本名为" DirectX 11的3D游戏编程简介"的示例书
它全部用VS2010编写.我想尝试使用VS2013 ......这是Windows桌面程序的示例项目
我有一个程序包含以下内容(包括一些其他文件作为常用的一部分):
color.fx
//***************************************************************************************
// color.fx by Frank Luna (C) 2011 All Rights Reserved.
//
// Transforms and colors geometry.
//***************************************************************************************
cbuffer cbPerObject
{
float4x4 gWorldViewProj;
};
struct VertexIn
{
float3 PosL : POSITION;
float4 Color : COLOR;
};
struct VertexOut
{
float4 PosH : SV_POSITION;
float4 Color : COLOR;
};
VertexOut VS(VertexIn vin)
{
VertexOut vout;
// Transform to homogeneous clip space.
vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj);
// Just pass vertex color into the …Run Code Online (Sandbox Code Playgroud) 我对3D游戏中的地图(即魔兽世界)以及程序员如何渲染它们有一些疑问,所以我不应该为每个人打开一个帖子,我想我应该在一个地方问他们所有人.
是否有可能通过某种技术"平滑"山脉的边缘,或唯一可能的解决方案是在高度图中使用更多的顶点?
我错了,并认为他们使用某种技术,因为他们只是为每座山提供了相当数量的顶点?
看一下这张图片:http: //wow.gamona.de/wp-content/gallery/dun-morogh/dun_morogh_008.jpg 关于如何渲染这种场景的一些问题:
我目前正在学习OpenGL,但我也标记了DirectX,因为这些问题并不是特定于API的.
我正在尝试使用Shells技术在Unity中实现毛发.Fins技术是故意遗漏的,因为我希望它在低端手机(主要是Android设备)上运行,并且需要OpenGL ES 3.0及更高版本,而Shells技术只需要OpenGL ES 2.0.
有一个基于XNA的Shell技术的例子,我试图将它移植到Unity但它无法工作.这是XNA项目的文章.
在XNA着色器:
float4x4 World;
float4x4 View;
float4x4 Projection;
float CurrentLayer; //value between 0 and 1
float MaxHairLength; //maximum hair length
texture FurTexture;
sampler FurSampler = sampler_state
{
Texture = (FurTexture);
MinFilter = Point;
MagFilter = Point;
MipFilter = Point;
AddressU = Wrap;
AddressV = Wrap;
};
struct VertexShaderInput
{
float3 Position : POSITION0;
float3 Normal : NORMAL0;
float2 TexCoord : TEXCOORD0;
};
struct …Run Code Online (Sandbox Code Playgroud)