GLSL:无法获取制服位置

2024-01-06

我的问题是,我无法获得某些制服的位置,而其他制服的位置我却没有问题。

例如,我的 VS 制服称为“MVP”和“模特”,并且“MVP”位置没有问题,但我没有对称使用的“模特”位置。 以同样的方式,我无法从 FS 中的 Light 结构中获取字段的位置。

其代码将数据传递到着色器:

bool Shader::SetShaderParameters(mat4 MVPMatrix,mat4 Model,GLint textureUnit)
{
  GLuint matrixLocation = glGetUniformLocation(programID,"MVP");
  if(matrixLocation==-1)
    return false;
  glUniformMatrix4fv(matrixLocation,1,GL_FALSE,&MVPMatrix[0][0]);
  GLuint modelLocation = glGetUniformLocation(programID,"Model");
  if(modelLocation==-1)
    return false;
  glUniformMatrix4fv(modelLocation,1,GL_FALSE,&Model[0][0]);
  return true;
}

bool Shader::SetShaderLights(vec3 lightColor,vec3 ambientIntensity,vec3 direction,vec3 diffuseIntensity)
{
    GLuint lightColorLocation = glGetUniformLocation(programID,"light.lightColor");
    if(lightColorLocation==-1)
        return false;
    glUniform3fv(lightColorLocation,1,&lightColor[0]);
    GLuint ambientIntensityLocation = glGetUniformLocation(programID,"light.ambientIntensity");
    if(ambientIntensityLocation==-1)
        return false;
    glUniform3fv(ambientIntensityLocation,1,&ambientIntensity[0]);
    GLuint directionLocation = glGetUniformLocation(programID,"light.direction");
    if(directionLocation==-1)
        return false;
    glUniform3fv(directionLocation,1,&direction[0]);
    GLuint diffuseIntensityLocation = glGetUniformLocation(programID,"light.diffuseIntensity");
    if(diffuseIntensityLocation==-1)
        return false;
    glUniform3fv(diffuseIntensityLocation,1,&diffuseIntensity[0]);
    return true;
}

这是着色器的代码:

VS:

#version 440 core

layout(location=0) in vec3 vertexPosition;
layout(location=1) in vec2 vertexUV;
layout(location=2) in vec3 normal;

out vec2 uv;
out vec3 norm;

uniform mat4 Model;
uniform mat4 MVP;

void main()
{
  gl_Position = MVP*vec4(vertexPosition,1.0);
  uv = vertexUV;
  norm = (Model*vec4(normal,0.0)).xyz;
}

FS:

#version 440 core

struct Light
{
  vec3 lightColor;
  vec3 ambientIntensity;
  vec3 direction;
  vec3 diffuseIntensity;
};

in vec2 uv;
in vec3 norm;

out vec3 color;

uniform sampler2D texSamp;
uniform Light light;

void main()
{
  color = texture(texSamp,uv).rgb*light.ambientIntensity;
}

在获取制服位置时,各种行为可能会出现什么问题?也许我使用了不好的着色器版本,或者是着色器中数据的优化。我正在调试我的解决方案,并且非常确定着色器程序 ID 是正确的。

[编辑]: 当我尝试在 FS 中使用范数时,没有任何变化,并且在无法获取位置的 glGetUniformLocation() 之后,我得到零错误代码。


编译器可以优化掉任何未使用的制服,这就是您收到此错误的原因。

您可以放心地忽略这一点。如果找不到制服,glGetUniformLocation返回-1。来自 OpenGL 4.3 规范,第 7.6.1 节:

如果位置的值为 -1,Uniform* 命令将静默 忽略传入的数据,当前的统一值不会被 改变了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GLSL:无法获取制服位置 的相关文章

  • 如何快速将一个float打包为4个字节?

    我一直在寻找一种在 WebGL 纹理上存储浮动的方法 我找到了一些解决方案 http aras p info blog 2009 07 30 encoding floats to rgba the final 在互联网上 但那些只处理 0
  • OpenGL 将着色器附加到程序

    有没有办法访问附加到程序的着色器 也就是说 给定一个程序 我可以做类似的事情 vertexShader getVertexShaderFromProgram program 我想在验证我的程序的函数中记录着色器编译状态 但我只保留对程序的引
  • Opengl 非同步/非阻塞地图

    我刚刚找到以下内容OpenGL 规范ARB map buffer range http www opengl org registry specs ARB map buffer range txt 我想知道是否可以使用此扩展进行非阻塞地图调
  • 如何将 3D 图像输出到 3D 电视?

    我有一台 3D 电视 如果我不至少尝试让它显示我自己创作的漂亮 3D 图像 我就会逃避我的责任 作为一个极客 我之前已经完成了非常基本的 OpenGL 编程 因此我了解所涉及的概念 假设我可以为自己渲染一个简单的四面体或立方体并使其旋转一点
  • OpenGL 说“from_param 收到了一个不连续的数组”

    安装 Yosemite 后 我必须升级 numpy PyOpenGL 等 现在 以前运行的程序给了我以下堆栈跟踪 file latebind pyx line 44 in OpenGL accelerate latebind Curry c
  • (定义一个宏)方便OpenGL命令调试?

    有时插入条件打印和检查需要很长时间glGetError 使用二分搜索的形式来缩小范围 其中第一个函数调用是 OpenGL 首先报告错误 我认为如果有一种方法可以构建一个宏 我可以包装所有可能失败的 GL 调用 并有条件地调用 那就太酷了gl
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • GLSL - 计算表面法线

    我有一个用 GLSL 编写的简单顶点着色器 我想知道是否有人可以帮助我计算表面的法线 我正在 升级 一个平面 所以当前的灯光模型看起来 很奇怪 这是我当前的代码 varying vec4 oColor varying vec3 oEyeNo
  • glutPostRedisplay 不在循环内工作

    我试图让一个人在 y 轴上跳跃 所以我使用 2 秒的循环 第一秒它应该向下移动并弯曲膝盖 第二秒它应该向上移动 然后在起始位置完成 现在我刚刚开始让这个人在第一秒内跪下并弯曲膝盖 我还没有编写动画的其余部分 问题是 glutPostRedi
  • 即使在顶点着色器中使用,glGetUniformLocation()也会返回-1

    我正在尝试用法线渲染一个简单的立方体 我使用以下代码来初始化着色器 void initShader const char vertexShaderPath const char fragmentShaderPath cout lt lt I
  • glEnableVertexAttribArray 中“index”参数的含义以及(可能)OS X OpenGL 实现中的错误

    1 我是否正确理解 要使用顶点数组或VBO进行绘制 我需要所有属性在着色器程序链接之前调用glBindAttribLocation 或者在着色器程序成功链接后调用glGetAttribLocation 然后使用glVertexAttribP
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • lwjgl 3 , glUniformMatrix4 导致 jre 崩溃

    我正在使用 lwjgl 3 并学习现代 opengl 3 我想将统一矩阵发送到顶点着色器 以便我可以应用转换 我尝试过 但程序因此错误而崩溃 A fatal error has been detected by the Java Runti
  • 解决 Three.js / webGL 中的 gl_PointSize 限制

    我正在使用 Three js 创建交互式数据可视化 此可视化涉及渲染 68000 个节点 其中每个不同的节点具有不同的大小和颜色 最初我尝试通过渲染网格来实现此目的 但事实证明这非常昂贵 我当前的尝试是使用 Three js 粒子系统 每个
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • 如果我用opengl绘图的话SDL Renderer就没用了吗?

    我正在学习 SDL2 但我也在使用使用 OpenGL 调用的 imgui 库 从我在网上各种博客上读到的内容来看 我无法轻松混合 SDL2 渲染器和 opengl 调用 我要么使用其中之一 要么使用另一个 我读过的大多数教程都使用渲染器 所
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • OpenGL ES 2.0 中的纹理点?

    我正在尝试在 OpenGL ES 2 0 中为粒子系统实现纹理点 例如点精灵 我遇到的问题是所有点都渲染为实心黑色方块 而不是正确映射纹理 我已经验证 gl PointCoord 实际上返回从 0 0 到 1 0 的 x y 值 这将映射到

随机推荐

  • 将图例添加到 LineCollection 图中

    这是与中给出的答案相关的派生问题根据颜色图设置线条颜色 https stackoverflow com questions 19868548 set line colors according to colormap其中建议了一个很好的解决
  • ASP.NET MVC:路由层次结构 URL

    我该如何为此制定路由 URL 类别 主 子 or 类别 主 sub1 subsub 我希望有 主 子 and 主 子1 子子 作为 CategoryController 的 Index 操作方法中的参数 找到了答案 应在路由路径中使用 ca
  • 使用 Node 'pg' 库连接到 Amazon Redshift

    我尝试使用 pg 库将我的 API 连接到 Redshift 实例 但出现以下错误 Possibly unhandled error SET TIME ZONE is not supported at Connection parseE U
  • Http 304 和缓存控制:无缓存

    我看到对网络服务器的一些调用的以下响应 初始调用 HTTP 1 1 200 OK Date Mon 16 Jan 2012 05 46 49 GMT X Powered By Servlet 2 5 JSP 2 1 Content Type
  • 向 D3 和弦图添加标签

    我是一名菜鸟程序员 所以这对于你们大多数人来说可能是一个简单的任务 此和弦图的标签和 或鼠标悬停文本需要哪些代码行 http mbostock github com d3 ex chord html http mbostock github
  • 在 azure 搜索中索引字典属性

    我有一个具有 type 属性的 DTODictionary
  • TextInputLayout 错误状态下的提示颜色

    根据 Google 的材料指南 https material io guidelines components text fields html text fields layout https material io guidelines
  • 拖动列时显示列标题

    我在中实现代码可分组标题 http www java2s com Code Java Swing Components GroupableGroupHeaderExample htm并尝试启用允许的重新排序 但我有两个问题 1 拖动列时 标
  • 使用自定义插值内核的 MATLAB imresize

    如何使用我的函数作为 MATLAB 中 imresize 函数的插值方法 我阅读了MATLAB关于如何使用自定义函数进行插值方法的帮助 但没有任何明确的示例 我试着为妈妈写一段代码 The imresize命令将默认使用bicubic方法
  • 这个只有一个操作数的 x86-64 addq 指令是什么意思? (摘自CSAPP书籍第三版)

    在下面的说明中 addq 是如何工作的 它只有一个操作数 书上声称它递增 rdx 但 rdx 不在这条指令中 我感到很困惑 这是来自 计算机系统 程序员的视角 一书 第三版 正如 Jester 在评论中指出的那样 这确实是一个错误 我实际上
  • 如何在带引号的表达式中转义扩展路径名扩展模式?

    除了基本的 and 模式 Bash shell 提供了扩展的模式匹配运算符 例如 pattern list 匹配除给定模式之一之外的所有模式 这extglob需要设置 shell 选项才能使用它们 一个例子 mkdir test cd te
  • 根据项目特定情况设置函数默认值 R

    通常 我使用相同的功能设置 我想知道除了在路径中拥有一个本质上是函数包装器的新对象之外 是否还有一种方法来设置默认参数 例如 paste 有它的sep参数设置为空格 我写累了 sep 一遍又一遍 那么有没有办法 暂时 用我选择的默认值替换该
  • 如何从 SVN 的修订版本中删除 1 个文件?

    我的一位同事在 SVN 中签入了一些文件 其中一个文件中有密码 密码已从文件中删除 并签入了新版本 但如果我们查看修订历史记录并转到该修订版本 密码显然仍在存储库中 我们使用 TortoiseSVN 作为客户端 那么如何安全地从 SVN 存
  • Apple iTunes Connect Analytics:归因提供商和营销活动 ID 值传递给应用程序委托

    新的 iTunes Connect 现在具有分析功能 您可以在 URL 中指定提供商 pid ID 和活动 ID cid 例如 您可以将这些值传递到应用程序中以用于各种目的吗 即使经过检查 我也找不到任何表明这一点的内容 didFinish
  • CamelCasePropertyNamesContractResolver 在 MapHttpRoute 之后不工作

    我正在尝试在我的 Net API 项目中实现 JSON 驼峰式大小写 在我的启动类中 我添加了以下几行 config Formatters JsonFormatter SerializerSettings ContractResolver
  • ASP.NET MVC 中的模型绑定嵌套集合

    我正在使用史蒂夫 桑德森的BeginCollectionItem 帮助器 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc
  • Rails 3 - 如何从 link_to 创建新记录

    我正在尝试创建一个 标签 功能 允许用户 标记 他们感兴趣的项目 这是我的模型 class tag belongs to user belongs to item end 对应的DB表有必要的 user id and item id字段 在
  • 通过WebService发送电子邮件

    我在Windows上开发了应用程序 现在我需要通过 Web 服务发送一封电子邮件 包括附件功能 我怎样才能做到这一点 我还需要在 n 天之前通知电子邮件 n 天是由用户控制的功能 如果有任何意见请告诉我 Thanks public bool
  • 如何使用另一个位图作为掩码在位图上绘图?

    我想要draw在位图上使用另一个位图作为掩码 蒙版是一个黑色位图 其中有一个透明对象 我希望这个透明部分填充任意颜色并添加到我的原始图像中 如何才能做到这一点 蓝色 我必须按照 Christian 的描述更换面具 然后 可以很容易地产生想要
  • GLSL:无法获取制服位置

    我的问题是 我无法获得某些制服的位置 而其他制服的位置我却没有问题 例如 我的 VS 制服称为 MVP 和 模特 并且 MVP 位置没有问题 但我没有对称使用的 模特 位置 以同样的方式 我无法从 FS 中的 Light 结构中获取字段的位