Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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 无gl_光源的照明[0]_Java_Opengl_Graphics_Glsl_Lwjgl - Fatal编程技术网

Java 无gl_光源的照明[0]

Java 无gl_光源的照明[0],java,opengl,graphics,glsl,lwjgl,Java,Opengl,Graphics,Glsl,Lwjgl,在GLSL中写入时,glu光源[0].position.xyz的等效值是什么?换句话说,我如何在GLSL中获取vec3(或vec4)并对其应用OpenGL应用于gl\u光源[0]的相同转换。位置?有我可以使用的mat4吗?你可以做任何你想做的事。这就是着色器的优点。给自己定义一套描述灯光的制服。它的位置可能在您想要的任何空间中,您只需以某种方式应用正确的变换 着色器都是关于自由选择的,您可以做任何最适合您的事情。固定功能OpenGL在眼睛/视图空间中进行照明计算,即在modelview变换之后。

GLSL
中写入时,
glu光源[0].position.xyz
的等效值是什么?换句话说,我如何在
GLSL
中获取
vec3
(或
vec4
)并对其应用OpenGL应用于
gl\u光源[0]的相同转换。位置
?有我可以使用的
mat4
吗?

你可以做任何你想做的事。这就是着色器的优点。给自己定义一套描述灯光的制服。它的位置可能在您想要的任何空间中,您只需以某种方式应用正确的变换


着色器都是关于自由选择的,您可以做任何最适合您的事情。固定功能OpenGL在眼睛/视图空间中进行照明计算,即在modelview变换之后。为此,在调用
glLightfv(GL\u light…,GL\u position…)
时,它会使用模型视图变换灯光位置。然后,在绘制几何体时,也应用了modelview变换后,将在视图空间中执行照明计算。

当我尝试在片段着色器中执行此操作时,会出现奇怪的照明错误。代码基本上是用
(gl\U ModelViewMatrix*lightPos).xyz
替换
gl\U光源[0]。位置.xyz
,其中lightPos是作为vec4的灯光位置。但是灯光最终看起来与我使用
gl\u光源[0]
@Abaab:gl\u ListSource[0]时不同。位置是未转换的灯光位置,如使用
glLightfv(gl\u light…,gl\u position…)
设置的那样。它的作用与通用制服完全相同,没有进行特殊处理。无论使用通用统一还是内置状态变量,都必须在着色器代码中应用变换。着色器不是固定函数,因此必须重新创建任何固定函数处理(因此可以使用方便的函数,如
fttransform
)。此外,使用对象的modelview矩阵变换灯光位置可能不是正确的做法。@Abaab:一般来说,在使用着色器时,根本不应使用FFP内置制服。这样做没有好处。始终使用通用制服并定义最适合您的问题的转换。在使用着色器时将自己限制在FFP语义中是疯狂的。等等。。。我以为
gl\u光源[0]。位置
受到
glTranslatef()
glRotatef()
的影响。我错过什么了吗?此外,如果使用modelview矩阵变换灯光位置不是正确的做法,那么该怎么办?@Abaab:fixed函数中的灯光位置受modelview矩阵的影响。但当您使用着色器时,您有责任执行由固定函数执行的所有操作。这包括变换灯光位置。你用来乘法的矩阵完全由你决定。但是,通常的方法是将客户端上的灯光位置转换为视图坐标,并通过统一将视图坐标中的灯光位置传递到着色器中。或者传递矩阵,通过该矩阵在单独的均匀中变换灯光位置。