- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在处理顶点蒙皮着色器,但出于某种原因,我的程序找不到统一的位置。
顶点着色器代码:
#version 330
const int MAX_JOINTS = 30;
const int MAX_WEIGHTS = 3;
in vec3 position;
in vec2 textureCoords;
in vec3 normal;
in ivec3 boneIndices;
in vec3 weights;
out vec4 fragPos;
out vec3 n;
out vec2 texCoords;
out vec4 mcolor;
uniform mat4 modelMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 normalMatrix;
uniform mat4[MAX_JOINTS] boneTransforms;
void main() {
vec4 totalLocalPos = vec4(0.0);
vec4 totalNormal = vec4(0.0);
for(int i = 0; i < 3; i++){
mat4 boneTransform = boneTransforms[boneIndices[i]];
vec4 posePosition = boneTransform * vec4(position, 1);
totalLocalPos += posePosition * weights[i];
vec4 worldNormal = boneTransform * vec4(normal, 1);
totalNormal += worldNormal * weights[i];
}
texCoords = textureCoords;
fragPos = modelMatrix * vec4(position,1);
n = totalNormal.xyz;
gl_Position = projectionMatrix * viewMatrix * modelMatrix * totalLocalPos;
}
boneTransforms 制服似乎设置不正确;如果我用
查询现役制服GLint uniforms;
glGetProgramiv(shaderProgramID, GL_ACTIVE_UNIFORMS, &uniforms);
for (int i = 0; i < uniforms; i++){
int name_len = -1, num = -1;
GLenum type = GL_ZERO;
char name[100];
glGetActiveUniform(shaderProgramID, GLuint(i), sizeof(name) - 1,
&name_len, &num, &type, name);
name[name_len] = 0;
}
我总是得到零;但是,如果我只是把 gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position,1) 我得到预期的结果(没有任何顶点蒙皮的正确渲染),所以其他变换似乎在工作,尽管它告诉我它们没有存在? 编辑:有时是这种情况,其他时候我在位置 (0,0,0) 获得模型,但在其他情况下正确渲染。
我读过有关编译器剥离未使用/非事件制服的信息,但如果我使用 boneTransforms 计算 totalLocalPos 并将其用于 gl_Positions,则制服应该处于事件状态。
我尝试设置制服
vector<glm::mat4> boneTransforms = model.getBoneTransforms();
int location = glGetUniformLocation(shaderProgramID, "boneTransforms");
glUniformMatrix4fv(location, boneTransforms.size(), false, (GLfloat*)&boneTransforms);
位置总是-1。我尝试设置此特定制服的方式有问题,还是着色器代码中有错误?
EDIT2:我刚刚注意到当我从场景中添加或删除对象(使用不同的着色器)时,我的着色器的行为发生了变化。我不知道该怎么做。
EDIT3:如果我从我的场景中删除所有其他网格,着色器会因访问冲突而崩溃。只要正在渲染另一个对象,目前就不会发生崩溃。
另一个编辑:显然访问权重变量会使我的着色器崩溃。
最佳答案
我正在阅读这里找到的关于顶点蒙皮着色器的快速教程:khronos并且它似乎使用的是稍旧版本的 GLSL 他们如何提及 MVP 矩阵(模型 View 投影矩阵)或在您的情况下 PVM 矩阵(投影 View 模型矩阵)与 vec4 的乘法总计position 在你的情况下并将其存储回 gl_Position
并且他们声称 w
可能并不总是具有 1
的值所以为了安全他们建议改为这样做,我将使用您的代码作为示例来解决这个可能的问题。
改变这个:
gl_Position = projectionMatrix * viewMatrix * modelMatrix * totalLocalPos;
对此:
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(totalLocalPos.xyz, 1.0);
看看这是否对您有帮助。我不知道这是否是您问题的原因,但从您展示的情况来看,除此之外,您的着色器似乎没问题。
关于c++ - 找不到 GLSL 着色器统一位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44324908/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!