Opengl 在glsl中同时使用phong和纹理

Opengl 在glsl中同时使用phong和纹理,opengl,glsl,Opengl,Glsl,我的着色器有问题。我尝试在我的游戏中使用glsl添加纹理和phong着色,但是我没有得到任何好的效果 我已经在谷歌搜索了很长时间,但我找不到任何关于如何将灯光和纹理联系在一起的信息,所以我决定在这里写信询问 这是我的无纹理游戏: 这就是纹理: 我想要实现的是使这个粉红色的纹理在中心点上更清晰可见-就像没有纹理一样,并且修复水槽上的逐顶点着色-使其逐像素着色,我不知道现在出了什么问题 我已经检查了大约10个带有phong着色的着色器,我还得到了逐顶点而非逐像素着色 这是我的片段顶点代码也许有人

我的着色器有问题。我尝试在我的游戏中使用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;
    }
和我的顶点着色器

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=(纹理2D(myTexture,vTexCoord))+最终颜色

现在它只是为了明亮,但现在我必须在舞台上点亮一点灯光,那会很棒的。但我仍然没有逐像素着色,而是逐顶点着色。这是我当前的屏幕,我在示例中标记了我所说的着色的含义:

这个等式:

gl_FragColor = gl_FrontLightModelProduct.sceneColor + (texture2D(myTexture, vTexCoord)) + finalColor;
对大多数纹理没有任何意义。您将获取从照明方程生成的颜色,并将其添加到从纹理采样的颜色中。只有当存储在纹理中的值表示曲面的发光特性时,这才有意义


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

你能显示设置并传递到GL纹理坐标的代码吗?@MārtiņšMožeiko编辑并添加了如果只渲染纹理而完全没有照明会发生什么情况?@Nicolas,我有得到了正常的纹理-很好color@sebap123你应该做
finalColor+=Iamb+((texture2D(myTexture,vTexCoord))*Idiff)+Ispec不应该添加,而是应该进行乘法。漫反射颜色应该如何与漫反射纹理颜色组合?补充?倍增?还有别的吗?环境光和镜面反射纹理是否相同?
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);