为什么我的压扁着色器(来自Lighthouse3d教程)不起作用
Why My Flatten Shader (from Lighthouse3d Tutorial) Is Not Working?
本教程有一个名为"压扁着色器"的示例,它将GLUT茶壶显示为压扁茶壶。这是"展平着色器"的链接。
我做的每件事都和教程中提到的步骤完全一样,但我的茶壶并不像教程中的茶壶那样是平的。它看起来就像一个普通的茶壶。
以下是顶点着色器的代码:
void main()
{
vec4 v = vec4(gl_Vertex);
v.z = 0.0;
gl_Position = gl_ModelViewProjectionMatrix * v;
}
这是我的碎片着色器:
void main()
{
gl_FragColor = gl_Color;
}
下面是我画茶壶的方法:
void display ( void )
{
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt( 0.0, 0.0, 2.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0
);
glMultMatrixd(trackball->getRotation());
const GLfloat diffuseIntensity[] = { 0.8, 0.4, 0.4, 1.0 };
const GLfloat specularIntensity[] = { 0.5, 0.5, 0.5, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuseIntensity);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specularIntensity);
glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 5.0 );
glutSolidTeapot(1.0);
glutSwapBuffers();
}
虽然它应该是"平的",但显示的茶壶就像一个普通的茶壶。如果你认为我错过了一些初始配置/设置步骤,那么不要因为我已经错过了:
GLuint createShader ( const GLchar* const source, GLenum type )
{
GLuint shader = glCreateShader( type );
glShaderSource( shader, 1, const_cast<const GLchar**>(&source), 0 );
glCompileShader( shader );
return shader;
}
和:
GLuint createProgram ( const GLuint shader )
{
GLuint program = glCreateProgram();
glAttachShader(program, shader);
glLinkProgram(program);
return program;
}
这就是一切结合在一起的地方:
GLuint vertexShader = createShader(vertexShaderSource, GL_VERTEX_SHADER);
GLuint fragmentShader = createShader(fragmentShaderSource, GL_FRAGMENT_SHADER);
GLuint vertexShaderProgram = createProgram(vertexShader);
GLuint fragmentShaderProgram = createProgram(fragmentShader);
glUseProgram(vertexShaderProgram);
glUseProgram(fragmentShaderProgram);
我哪里错了?
几件事:
-
您没有正确绑定着色器。createProgram函数需要将片段着色器和顶点着色器绑定在一起。您应该将其替换为如下代码:
GLuint createProgram ( const GLuint fshader, const GLuint vshader ) { GLuint program = glCreateProgram(); glAttachShader(program, fshader); glAttachShader(program, vshader); glLinkProgram(program); return program;
}
-
相应地,您应该将最后一个代码片段修改为如下所示:
GLuint vertexShader = createShader(vertexShaderSource, GL_VERTEX_SHADER); GLuint fragmentShader = createShader(fragmentShaderSource, GL_FRAGMENT_SHADER); GLuint shaderProgram = createProgram(fragmentShader, vertexShader); glUseProgram(shaderProgram);
-
此外,可能还有其他问题。您应该使用glGet(Shader|Program)InfoLog来帮助调试着色器,还应该调用glGetError来帮助诊断程序失败的位置。
-
最后,我不能保证这个堆栈交换答案的可信度,但显然在一些旧的ATi实现中,gl_Color是vec3,而不是vec4,因此在赋值之前需要对其进行强制转换。请参阅以下讨论:GLSL片段着色器语法错误
除了Mikola的回答之外,您不需要每次都检查信息日志;您可以检查着色器是否正确编译以及程序是否正确链接,并且仅在发生错误时调用glGetShaderInfoLog
和glGetProgramInfoLog
。
这里有一些代码可以做到这一点(在Python中,但翻译成C++是微不足道的):
# create your vertex shader, attach its source, etc.
glCompileShader(vertex_shader)
rc_compile = GLint()
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, rc_compile)
if rc_compile.value == GL_FALSE: # shader compilation failed
info = create_string_buffer(1024)
glGetShaderInfoLog(vertex_shader, 1024, None, info)
glDeleteShader(vertex_shader)
raise Exception(info.value)
# do the same thing for a fragment shader and create a program to link the two
glAttachShader(program, vertex_shader)
glAttachShader(program, fragment_shader)
rc_link = GLint()
glGetProgramiv(program, GL_LINK_STATUS, rc_link)
if rc_link.value == GL_FALSE: # program link failed
info = create_string_buffer(1024)
glGetProgramInfoLog(program, 1024, None, info)
glDeleteProgram(program)
raise Exception(info.value)
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 2D数组来自文本输入,中间有空格
- 通过继承类使用来自不同命名空间的运算符
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- C++:来自外部文件的Trivia
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 针对遗留库的链接:来自预制makefile的-lgfortranbegin
- 如何在C++中正确引用来自不同类的类的对象?
- Qt中来自不同功能的按钮引用
- C++包含来自 #include "DevEngine/Core.h" 的错误
- Eigen c++ 三角形来自
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 中止信号来自 C++ 中的中止(3) (SIGABRT)
- 如何多次询问来自QML对话框的输入?
- 如何强制 Thrift 仅接受来自本地主机的连接
- 使 ld 忽略来自 /etc/ld.so.conf 的目录
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 来自colPivHouseholderQr().solve的拟合相关性
- 为什么我的压扁着色器(来自Lighthouse3d教程)不起作用