Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从顶点着色器到片段着色器的灯光_Java_Opengl_Jogl_Fragment Shader_Vertex Shader - Fatal编程技术网

Java 从顶点着色器到片段着色器的灯光

Java 从顶点着色器到片段着色器的灯光,java,opengl,jogl,fragment-shader,vertex-shader,Java,Opengl,Jogl,Fragment Shader,Vertex Shader,需要在片段着色器中创建聚光灯以照亮球体。目前我在顶点着色器中有一个点光源,完全不知道如何咬它 #version 140 in vec4 vPosition; in vec4 vNormal; out vec4 color; // implicit definition: out vec4 gl_Position; uniform mat4 model; uniform mat4 view; uniform mat4 projection; uniform vec4 lPosi

需要在片段着色器中创建聚光灯以照亮球体。目前我在顶点着色器中有一个点光源,完全不知道如何咬它

 #version 140
in  vec4 vPosition;

in  vec4 vNormal;

out vec4 color;

// implicit definition: out vec4 gl_Position;

uniform mat4 model;

uniform mat4 view;

uniform mat4 projection;

uniform vec4 lPosition;

uniform vec4 lAmbient;

uniform vec4 lDiffuse;

uniform vec4 lSpecular;

uniform float Shininess;

uniform vec4 matColor;

void main() 
{
    vec4 ambient, diffuse, specular;
    vec3 N,L,E,H;

    gl_Position = projection * view * model * vPosition;
    ambient = matColor*lAmbient;

    N = normalize((view*model*vNormal).xyz);
    L = normalize((view*model*lPosition).xyz - (view*model*vPosition).xyz);
    diffuse = max(dot(L,N), 0.0)*(matColor*lDiffuse);

    E = -normalize((view * model * vPosition).xyz);
    H = normalize(L + E);
    specular = max(pow(max(dot(N, H), 0.0), Shininess)
                *lSpecular, 0.0);

    color = vec4((ambient+diffuse+specular).rgb, 1.0);
 }
据我所知,聚光灯不同于点光源,它的衰减包含常数、线性和二次衰减+截止参数

就我而言:

计算聚光灯效果:

spottEffect = pow(max(dot(spotdirection, gl_Position), 0.0), spotexponent);
计算衰减:

att = (1 / (const_attenuation + linear_attenuation * (view*model*lPosition) + quadratic_attenuation * (view*model*lPosition) * (view*model*lPosition))).xyz;

它应该是正确的,因为我对文章的理解是正确的,尽管我不知道下一步该怎么做。。。为截止值添加if语句?

只需像其他数据一样通过变量传递所需的任何数据。你使用的是什么opengl版本?有什么原因不能将聚光灯制服放入片段着色器中吗?没有-好了,我现在知道如何传递它们,但不知道如何实现聚光灯。它是opengl3。我有所有的变量,如恒定衰减、截止等@mjanisz1,你还需要帮助吗?@选择否,谢谢: