gpt4 book ai didi

c++ - GLSL 从 v110 移植到 v150?

转载 作者:太空狗 更新时间:2023-10-29 21:44:29 25 4
gpt4 key购买 nike

我正在尝试将着色器从 #version 110 移植到 150。我知道当从 110 移动到 150 时,全局 gl_ 属性已被弃用,因此所有这些属性都必须在着色器。然后必须通过 C++ 通过 glGetAttribLocation 调用 OpenGL 来设置指定的属性。

我有点不确定如何处理诸如 gl_MultiTexCoord0gl_TexCoord 之类的事情。

这里只是我尝试从 #version 110 移植到 150 的着色器之一:

//  blinn_phong.glsl
[vert]

#version 110

varying vec3 normal;

void main()
{
normal = normalize(gl_NormalMatrix * gl_Normal);

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}

[frag]

#version 110

uniform sampler2D colorMap;
uniform float materialAlpha;

varying vec3 normal;

void main()
{
vec3 n = normalize(normal);

float nDotL = max(0.0, dot(n, gl_LightSource[0].position.xyz));
float nDotH = max(0.0, dot(normal, vec3(gl_LightSource[0].halfVector)));
float power = (nDotL == 0.0) ? 0.0 : pow(nDotH, gl_FrontMaterial.shininess);

vec4 ambient = gl_FrontLightProduct[0].ambient;
vec4 diffuse = gl_FrontLightProduct[0].diffuse * nDotL;
vec4 specular = gl_FrontLightProduct[0].specular * power;
vec4 color = gl_FrontLightModelProduct.sceneColor + ambient + diffuse + specular;

gl_FragColor = color * texture2D(colorMap, gl_TexCoord[0].st);
gl_FragColor.a = materialAlpha;
}

任何人都可以提供一些好的资源来帮助这些版本之间的移植吗?

最佳答案

您必须设置自己的制服、属性、变量和片段着色器输出。代码将变得类似于:

[vert]

#version 150 core

uniform mat3 in_NormalMatrix;
uniform mat4 in_ModelViewProjectionMatrix;

in vec3 in_Normal;
in vec4 in_Vertex;
in vec2 in_MultiTexCoord;

out vec3 normal;
out vec2 texcoord;

void main()
{
normal = normalize(in_NormalMatrix * in_Normal);

gl_Position = in_ModelViewProjectionMatrix * in_Vertex;
texcoord = in_MultiTexCoord;
}

[frag]

#version 150

uniform sampler2D colorMap;
uniform float materialAlpha;

struct sLightSource
{
vec3 position;
vec3 halfVector;
...
}

uniform sLightSource u_LightSource;

in vec3 normal;
in vec2 texcoord;

out vec4 out_FragColor;

void main()
{
vec3 n = normalize(normal);

float nDotL = max(0.0, dot(n, u_LightSource.position.xyz));
float nDotH = max(0.0, dot(normal, vec3(u_LightSource.halfVector)));
...
out_FragColor = color * texture(colorMap, texcoord);
out_FragColor.a = materialAlpha;
}

附言这book有一整章专门介绍不同 GLSL 着色器版本之间的这种转换。

关于c++ - GLSL 从 v110 移植到 v150?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19977079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com