Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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
C++ 当我改变光源的位置时,为什么光源不移动?_C++_Opengl - Fatal编程技术网

C++ 当我改变光源的位置时,为什么光源不移动?

C++ 当我改变光源的位置时,为什么光源不移动?,c++,opengl,C++,Opengl,我已经在OpenGL上工作了一段时间,现在我在漫反射照明上工作。我已经设置了一种改变光源的方法,但是我的物体每次都好像在同一个地方 我继续检查片段着色器和顶点着色器是否正确,但似乎没有出现任何问题 这是发送到核心着色器的灯光位置: vec3-lightPos0=vec3(0.f,0.f,2.f); glUniform3fv(glGetUniformLocation(coreShader.getID(),“lightPos0”),1,value_ptr(lightPos0)); 下面是片段和顶点

我已经在OpenGL上工作了一段时间,现在我在漫反射照明上工作。我已经设置了一种改变光源的方法,但是我的物体每次都好像在同一个地方

我继续检查片段着色器和顶点着色器是否正确,但似乎没有出现任何问题

这是发送到核心着色器的灯光位置:

vec3-lightPos0=vec3(0.f,0.f,2.f);
glUniform3fv(glGetUniformLocation(coreShader.getID(),“lightPos0”),1,value_ptr(lightPos0));
下面是片段和顶点着色器(暗示存在所有常用变量):

#版本450
vec3顶点位置的布局(位置=0);
vec3顶点颜色的布局(位置=1);
vec2 vertex_texcoord中的布局(位置=2);
vec3顶点_法线中的布局(位置=3);
输出vec3 vs_位置;
输出vec3 vs_颜色;
out vec2 vs_texcoord;
输出vec3 vs_正常;
一致mat4模型矩阵;
一致mat4视图矩阵;
均匀mat4投影矩阵;
void main()
{
vs_位置=vec4(ModelMatrix*vec4(顶点位置,1.f)).xyz;
vs_颜色=顶点_颜色;
vs_texcoord=vec2(顶点_texcoord.x,顶点_texcoord.y*-1.f);
vs_法线=mat3(模型矩阵)*顶点_法线;
gl_位置=投影矩阵*视图矩阵*模型矩阵*向量4(顶点_位置,1.f);
}
#版本450
在vec3 vs_位置;
在vec3中与颜色对比;
在vec2 vs_texcoord中;
在vec3与正常对照组中;
输出vec4fs_颜色;
均匀采样2D纹理0;
均匀的二维纹理1;
均匀vec3-lightPos0;
void main()
{
//环境光
vec3环境光=vec3(0.1f、0.1f、0.1f);
//漫射光

vec3 posToLightDirVec=规格化(lightPos0-vs_位置); vec3 diffuseColor=vec3(1.f,1.f,1.f); 浮动漫反射=最大值(点(posToLightDirVec,vs_normal),0.0); vec3 diffuseFinal=diffuseColor*漫反射; 彩色= (纹理(纹理0,vs_texcoord))*vec4(vs_颜色,1.f) *(vec4(环境光,1.f)+vec4(漫反射最终,1.f)); }
如果你真的把所有这些都带到了这个程序看起来是什么样子,你会注意到你把光点放在哪里并不重要。你总是需要稍微向后移动才能真正看到任何东西。此外,您会看到它不是完全漫反射的,而是更像镜面反射照明。 如果您需要更多代码,请在注释中询问我。

这是您的问题:


vec3 posToLightDirVec=规格化(lightPos0-vs_位置);
vs_位置在局部空间中,因此不受变换的影响。先把它改造一下


vec3 posToLightDirVec=normalize(lightPos0-(ModelMatrix*vs_position).xyz);

在设置统一变量
lightPos0
的值之前,您必须将程序作为对象安装为当前渲染状态的一部分:

glUseProgram(coreShader.getID()) 注意,
glUniform3fv
更改当前安装程序的默认统一块中统一的值

当然,您可以在安装程序之前获取活动程序资源的索引(例如,
glGetUniformLocation
)。为此,链接程序就足够了,但不一定是当前程序。
如果比较函数,则可以看到程序对象是前者的参数,而不是后者的参数。对于
glUniform
的使用,程序必须是最新的。

由于提供了OpenGL 4.1,它可以为指定的程序对象指定统一变量的值

ModelMatrix是一个4x4矩阵,vs_位置只有3长。它们不相乘,我得到错误C1101:不明确的重载函数引用。在我停止编译器错误后,我得到了相同的问题。vec3 postolightdirevec=normalize(lightPos0-(ModelMatrix*vec4(vs_position,1.0)).xyz);这个答案是错误的
lightPos0
是世界空间中的一个位置。由于
vs_normal
vs_position
由模型矩阵(
ModelMatrix
)进行变换,因此它们也在世界空间中,一切正常。碎片着色器在世界空间中进行灯光计算,这很好。“它不是很漫反射,但更像镜面反射灯光”No.
dot(posToLightDirVec,vs_normal)
是一种完美的漫反射灯光。看,你如何改变光源的位置?当您更改位置(
glUniform3fv
)时,着色器程序是在之前安装的(
glUseProgram(coreShader.getID())
),不是吗?@rabbi76我通过更改第一条语句来更改它。例如,如果它是(0.f,2.f,2.f),您将看到,一旦灯光击中对象,它将位于y方向。然而,它似乎什么也没做。我明白了。但是您以前调用过
glUseProgram(coreShader.getID())
?请注意,
glUniform3fv
更改当前安装程序的默认统一块中统一的值。实际上,这正是问题所在。我想在VAOs被设计之前,它已经被加载了,但显然不是。再次谢谢你!