在glsl中同时使用phong和texture

seb*_*123 5 opengl glsl

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

我一直在搜索谷歌很长一段时间,我找不到任何信息如何连接光和纹理在一起,所以我决定写在这里问.

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

这是纹理:

与纹理

我想要实现的是让这个粉红色的纹理在中心点上更好地可见 - 就像没有纹理一样,并修复那些在排水沟上的每个顶点阴影 - 按照像素着色,我不知道现在有什么问题.

我已经检查了大约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;
    }
Run Code Online (Sandbox Code Playgroud)

和我的顶点着色器

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;


}
Run Code Online (Sandbox Code Playgroud)

我很乐意帮忙.

编辑:

这就是我将纹理放入着色器的方法.它工作正常(我认为)因为我可以在着色器中编辑纹理值 - 以某种方式.

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);
Run Code Online (Sandbox Code Playgroud)

编辑2:

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

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

现在只有光明,但现在我必须在舞台上稍微改变一下,并且会很棒.但是我仍然没有每像素着色而是每个顶点着色.这是我当前的屏幕,我已经在示例中标记了我所说的着色阴影:

在此输入图像描述

Nic*_*las 12

这个等式:

gl_FragColor = gl_FrontLightModelProduct.sceneColor + (texture2D(myTexture, vTexCoord)) + finalColor;
Run Code Online (Sandbox Code Playgroud)

对大多数纹理没有任何意义.您将采用光照方程生成的颜色并将其添加到从纹理中采样的颜色.只有存储在纹理中的值表示表面的发光属性时,这才有意义.

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

  • 漫反射颜色应如何与漫反射纹理颜色组合?添加?相乘?还有吗 环境和镜面纹理是否相同? (2认同)