gpt4 book ai didi

opengl - 在 glsl 中同时使用 phong 和纹理

转载 作者:行者123 更新时间:2023-12-03 03:55:32 24 4
gpt4 key购买 nike

我的着色器有问题。我正在尝试使用 glsl 在我的游戏中添加纹理和 phong 阴影,但我无法获得任何好的效果。

我在google上搜索了很长时间,但找不到任何如何将灯光和纹理连接在一起的信息,所以我决定在这里写信询问。

这是我没有纹理的游戏: without texture

这是带有纹理的:

with texture

我想要实现的是使这个粉红色纹理在中心点上变得更好可见 - 就像没有纹理一样,并且还修复排水沟上的每个顶点着色 - 使其按像素着色,我不知道什么现在是错误的。

我已经检查了大约 10 个带有 phong 着色的着色器,并且还得到了每个顶点而不是每个像素着色。

这是我的片段顶点代码,也许有人可以看到那里的东西?

    varying vec3 N;
varying vec3 v;
uniform sampler2D myTexture;

varying vec2 vTexCoord;

void main (void)
{
vec4 finalColor = vec4(0.0, 0.0, 0.0, 0.0);

vec3 L = normalize(gl_LightSource[0].position.xyz - v);
vec3 E = normalize(-v); // we are in Eye Coordinates, so EyePos is (0,0,0)
vec3 R = normalize(-reflect(L,N));

//calculate Ambient Term:
vec4 Iamb = gl_FrontLightProduct[0].ambient;

//calculate Diffuse Term:
vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);

// calculate Specular Term:
vec4 Ispec = gl_FrontLightProduct[0].specular
* pow(max(dot(R,E),0.0),0.3*gl_FrontMaterial.shininess);

finalColor+=Iamb + Idiff + Ispec;
// write Total Color:
gl_FragColor = gl_FrontLightModelProduct.sceneColor + (texture2D(myTexture, vTexCoord)) + finalColor;
}

和我的顶点着色器

varying vec3 N;
varying vec3 v;
varying vec2 vTexCoord;

void main(void)
{

v = vec3(gl_ModelViewMatrix * gl_Vertex);
N = normalize(gl_NormalMatrix * gl_Normal);
vTexCoord = vec2(gl_MultiTexCoord0);

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;


}

我很乐意提供帮助。

编辑:

这就是我将纹理放入着色器的方式。它工作得很好(我认为),因为我可以在着色器中以某种方式编辑纹理值。

int my_sampler_uniform_location = glGetUniformLocation(brickProg, "myTexture");

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);

glUniform1i(my_sampler_uniform_location,0);
CUTIL::drawBox();
glBindTexture(GL_TEXTURE_2D,0);

编辑2:

在 Nicol Bolas 关于颜色添加的建议之后,我编辑了我的着色器并将其更改如下:

gl_FragColor = (texture2D(myTexture, vTexCoord)) + FinalColor;

现在只是太亮了,但现在我必须在舞台上加一点灯光,那就太好了。但我仍然没有得到每像素着色,而是得到了每顶点着色。这是我当前的屏幕,我在示例中标记了我谈论着色的意思:

enter image description here

最佳答案

这个方程:

gl_FragColor = gl_FrontLightModelProduct.sceneColor + (texture2D(myTexture, vTexCoord)) + finalColor;

对于大多数纹理来说没有任何意义。您将采用照明方程产生的颜色并将其添加到从纹理采样的颜色中。仅当纹理中存储的值代表表面的发光属性时,这才有意义。

通常,纹理的颜色值表示表面的漫反射率。这意味着您需要将它们直接纳入照明方程中。纹理的颜色应该完全替换 Material 的漫反射颜色,或者应该以某种方式与 Material 漫反射颜色组合。

关于opengl - 在 glsl 中同时使用 phong 和纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8963378/

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