- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在我的片段着色器中初始化一个 usampler2D
uniform vec3 lightColor;
uniform usampler2D texSampler;///////////
uniform vec3 ambientLight;
uniform vec3 lightPosition;
uniform vec3 cameraPosition;
in Vertex{
vec4 rawPosition;
vec2 uv;
vec4 normal;
}vertexIn;
in InstanceData{
unsigned int textureUnitIndex;
}instance;
out vec4 color;
void main(){
vec3 normal = normalize(vec3(vertexIn.normal.x, vertexIn.normal.y, vertexIn.normal.z));
vec3 worldPosition = vec3(vertexIn.rawPosition.x, vertexIn.rawPosition.y, vertexIn.rawPosition.z);
vec3 lightVector = normalize(lightPosition - worldPosition);
vec3 cameraVector = normalize(cameraPosition - worldPosition);
vec3 halfVec = normalize(lightVector + cameraVector);
float lightAngle = clamp(dot(lightVector, normal), 0.0f, 1.0f);
float specAngle = clamp(dot(halfVec, normal), 0.0f, PI);
float specular = clamp(pow(specAngle, 128), 0.0f, 1.0f);
unsigned int index = instance.textureUnitIndex;
vec4 actColor = texture2D(texSampler, vec2(vertexIn.uv)); //////////////////////
vec4 diffuseLight = sqrt(actColor * vec4(lightColor, 1.0)) * lightAngle;
vec4 specularLight = 1.0f - (cos(vec4(lightColor, 1.0f) * specular));
color = actColor * (vec4(ambientLight, 1.0) + diffuseLight) + specularLight;// + vec4(ambientLight, 1.0f);
}
像这样
void ShaderProgram::addUniform(std::string uniformName, unsigned int uniformValue)
{
unsigned int loc = glGetUniformLocation(_programID, uniformName.c_str());
Graphic::checkOpenGLErrors("addUniform() - 1");
glUniform1ui(loc, (GLuint)uniformValue);
Graphic::checkOpenGLErrors("addUniform - 2");
}
loc 结果是 6 并且 uniformValue 等于 2 但 checkOpenGLErrors() 仍然抛出
“OpenGL 错误:GL_INVALID_OPERATION - 位于:addUniform - 2”
关于初始化采样器制服,您有什么需要了解的吗?因为这个函数在这个GLSL程序中通常不会抛出错误
谢谢
最佳答案
为 opaque types 上传制服时,您必须使用 glUniform1i
或 1iv
(包括采样器)。仅仅因为采样器使用无符号整数格式并不意味着统一调用会更改以匹配。
关于c++ - OpenGL glUniform1ui() 抛出 GLError GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40697354/
我正在使用 OpenGL 和 GLSL 在简单的网格上绘制纹理。 我的问题是,当我使用 glUniform1i 设置 sampler2D uniform 的值时,它没有被设置。例如在这段代码中: gl
我想知道 glUniformXXv 是否会阻塞,直到指针所指的数据被复制到 GPU。换句话说,如果 GPU 很忙,这段代码会导致问题吗? int i=5; glUniform1iv(location,
GLSL 代码和传递数据的 native 代码之间的类型必须匹配到什么程度? 例如,假设我有着色器代码: uniform float uFloat; uniform int uInt; in floa
当我调用 glUniform2fv 时到底会发生什么? 它是同步复制传递的缓冲区还是只是接受指针并稍后使用该数据?它保留缓冲区吗? 换句话说:在函数中传递本地创建的或非保留的缓冲区是否安全,或者由我来
再次嗨,欢迎来到另一个“如果我们将两件我真的不了解的事情结合起来会不会很棒”-问题;) 这一集:OpenGL 制服和 C++ 模板 想法:如果您可以编写一个模板函数来在 OpenGL 着色器中设置制服
我已经阅读了khronos的规范,我知道glProgramUniform*()将数据上传到指定的程序对象,而glUniform*()将数据上传到当前绑定(bind)的程序对象。但我想知道这两者之间是否
我目前正在编写一个 openGL 着色器类。我没有使用函数来设置每个统一类型,而是尝试将统一函数(例如 glUniform1f)作为参数传递。 我目前的尝试看起来像这样: template void
如果我有一个看起来像这样的片段着色器: #version 450 #define MAX_NUM_LIGHTS 10 #define NUM_CASCADES 6 uniform sampler2D
我正在关注 OpenGL v3.3 教程,该教程指示我使用 glUniform4f 修改片段着色器中的统一属性(请参阅下面的代码)。据我了解,OpenGL 是一个状态机,我们不会取消绑定(bind)当
背景 我目前正在围绕 OpenGL 的 glUniform 编写包装器C++ 中的函数,努力使它们类型安全。我有一堆 set_uniform 函数被重载以接受 OpenGL POD(GLint、GLu
我是一名优秀的程序员,十分优秀!