我有一个非常基本的GLSL程序,在第一次绘制调用后无法正确更新统一值.未收到glGetError任何错误,编译和链接着色器时信息日志中未报告任何错误,并且所有统一位置均有效.
顶点着色器:
#version 120
uniform mat4 mvp;
uniform mat3 nmv;
attribute vec3 position;
attribute vec3 normal;
varying vec3 v_normal;
void main()
{
v_normal = normalize(nmv * normal);
gl_Position = mvp * vec4(position, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
#version 120
uniform vec3 lightDir;
uniform vec3 lightColor;
uniform vec3 materialColor;
varying vec3 v_normal;
void main()
{
vec3 n = normalize(v_normal);
float nDotL = max(0.0, dot(n, lightDir));
gl_FragColor = vec4(materialColor * lightColor * nDotL, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
渲染代码:
glUseProgram(program);
glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, mvp);
glUniformMatrix3fv(nmvLoc, …Run Code Online (Sandbox Code Playgroud) 尝试从另一个模板类中访问模板类的模板成员函数时,我遇到编译器错误.函数调用getSubmatrix导致编译器警告,"表达式结果未使用",关于参数(0, 0),最终失败,编译器错误"必须调用非静态成员函数的引用".
矩阵类:
template <std::size_t m, std::size_t n, typename T, std::size_t rowPadding = 0>
class Matrix
{
public:
...
template <std::size_t p, std::size_t q>
Matrix<p, q, T, n - q>& getSubmatrix(std::size_t column, std::size_t row)
{
...
}
};
Run Code Online (Sandbox Code Playgroud)
变换类:
template <typename T>
class Transform
{
public:
...
Matrix<4, 4, T> matrix() const
{
...
Matrix<4, 4, T> result;
result.getSubmatrix<3, 3>(0, 0) = Matrix<3, 3, T>();
...
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,将矩阵类型更改为Matrix<4, 4, float>而不是Matrix<4, 4, T> …