【发布时间】:2013-09-04 16:40:34
【问题描述】:
我对 Visual Studio 和 C++ 也很陌生。我一直在尝试从 Ed Angels 的 Interactive Computer Graphics A Top-Down Approach with OpenGL 中获取 Sierpinski Gasket 示例,特别是第 2 章示例 1 Visual C++ 项目,我遇到了一些我无法解决的问题似乎解决或找到解决办法。我遇到的问题是,当我在 VS2012 中运行它时,窗口会立即关闭并出现错误,类似于它找不到 vshader21.glsl。当我从调试文件夹中的 6E Test.exe 运行它时,它可以正常打开,创建一个窗口,但它不显示任何三角形,只是一个空白的白色框。我已经下载了最新版本的 GLEW 和 freeglut,我很肯定我把所有东西都放在了正确的位置。
示例项目包括:Angel.h、vec.h、mat.h、CheckError.h、example1.cpp、InitShader.cpp、vshader21.glsl、fshader21.glsl
我相信错误来自 example1.cpp 行 GLuint program = InitShader( "vshader21.glsl", "fshader21.glsl" );没有找到文件但我已将 .glsl 添加到调试文件夹并更改了路径以转到项目属性工作目录中的调试文件夹。关于如何解决此问题的任何建议或解决方案?
#include "Angel.h"
const int NumPoints = 5000;
void
init( void )
{
vec2 points[NumPoints];
// Specifiy the vertices for a triangle
vec2 vertices[3] = {
vec2( -1.0, -1.0 ), vec2( 0.0, 1.0 ), vec2( 1.0, -1.0 )
};
// Select an arbitrary initial point inside of the triangle
points[0] = vec2( 0.25, 0.50 );
// compute and store N-1 new points
for ( int i = 1; i < NumPoints; ++i ) {
int j = rand() % 3; // pick a vertex at random
// Compute the point halfway between the selected vertex
// and the previous point
points[i] = ( points[i - 1] + vertices[j] ) / 2.0;
}
// Create a vertex array object
GLuint vao;
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );
// Create and initialize a buffer object
GLuint buffer;
glGenBuffers( 1, &buffer );
glBindBuffer( GL_ARRAY_BUFFER, buffer );
glBufferData( GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW );
// Load shaders and use the resulting shader program
GLuint program = InitShader( "vshader21.glsl", "fshader21.glsl" );
glUseProgram( program );
// Initialize the vertex position attribute from the vertex shader
GLuint loc = glGetAttribLocation( program, "vPosition" );
glEnableVertexAttribArray( loc );
glVertexAttribPointer( loc, 2, GL_FLOAT, GL_FALSE, 0,
BUFFER_OFFSET(0) );
glClearColor( 1.0, 1.0, 1.0, 1.0 ); // white background
}
void
display( void )
{
glClear( GL_COLOR_BUFFER_BIT ); // clear the window
glDrawArrays( GL_POINTS, 0, NumPoints ); // draw the points
glFlush();
}
void
keyboard( unsigned char key, int x, int y )
{
switch ( key ) {
case 033:
exit( EXIT_SUCCESS );
break;
}
}
int
main( int argc, char **argv )
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_RGBA );
glutInitWindowSize( 512, 512 );
// If you are using freeglut, the next two lines will check if
// the code is truly 3.2. Otherwise, comment them out
glutInitContextVersion( 3, 1 );
glutInitContextProfile( GLUT_CORE_PROFILE );
glutCreateWindow( "Sierpinski Gasket" );
glewInit();
init();
glutDisplayFunc( display );
glutKeyboardFunc( keyboard );
glutMainLoop();
return 0;
}
UPDATE 这是我按 F5 运行它时它告诉我的信息。 我的 GLEW 版本是 1.10.0,freeglut 是 2.8.1-1
“6E test.exe”(Win32):已加载“C:\Users\Robert\Documents\6E test\Debug\6E test.exe”。已加载符号。
'6E test.exe' (Win32): 加载 'C:\Windows\SysWOW64\ntdll.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\kernel32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\KernelBase.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Users\Robert\Documents\6E test\Debug\freeglut.dll'。模块是在没有符号的情况下构建的。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\user32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\gdi32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\lpk.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载 'C:\Windows\SysWOW64\usp10.dll'。无法找到或打开 PDB 文件。 “6E test.exe”(Win32):已加载“C:\Windows\SysWOW64\msvcrt.dll”。无法找到或打开 PDB 文件。 “6E test.exe”(Win32):已加载“C:\Windows\SysWOW64\advapi32.dll”。无法找到或打开 PDB 文件。 “6E test.exe”(Win32):已加载“C:\Windows\SysWOW64\sechost.dll”。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\rpcrt4.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\sspicli.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\cryptbase.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\opengl32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\glu32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\ddraw.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\dciman32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\setupapi.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\cfgmgr32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\oleaut32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\ole32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\devobj.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\dwmapi.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\winmm.dll'。无法找到或打开 PDB 文件。
“6E test.exe”(Win32):加载“C:\Users\Robert\Documents\6E test\Debug\glew32.dll”。模块是在没有符号的情况下构建的。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\msvcp110d.dll'。已加载符号。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\msvcr110d.dll'。已加载符号。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\imm32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载 'C:\Windows\SysWOW64\msctf.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\nvinit.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\uxtheme.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\ig7icd32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 加载 'C:\Windows\SysWOW64\version.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 卸载'C:\Windows\SysWOW64\version.dll'
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\ole32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 卸载'C:\Windows\SysWOW64\ole32.dll'
'6E test.exe' (Win32): 加载'C:\Windows\SysWOW64\ole32.dll'。无法找到或打开 PDB 文件。
'6E test.exe' (Win32): 卸载'C:\Windows\SysWOW64\ole32.dll'
'6E test.exe' (Win32):加载了 'C:\Windows\SysWOW64\clbcatq.dll'。无法找到或打开 PDB 文件。
程序“[6244] 6E test.exe”已退出,代码为 1 (0x1)。
【问题讨论】:
-
一定要检查一些版本号。编译着色器时可以捕获任何错误输出吗? InitShader() 会这样做吗?在那之后,我很难理解你是如何尝试生成顶点的——你能渲染一个普通的三角形吗?如果你的着色器编译得很好,我可能会猜到像缠绕之类的东西。
-
@genpfault :有人告诉我,它应该在下载所有内容并将其全部放在正确的位置后才运行。对不起,我是视觉工作室和 GLSL 的新手。
-
@Max Feldkamp:我更新了我认为你要求的一切。我使用了另一个成功生成三角形的示例,但在这个特定示例中没有。
-
谢谢!调试信息表明它在 CPU 端什么都没有(它发现着色器很好 - 一个很好的步骤),但是当您通过 InitShaders() 加载着色器时,您是否得到任何输出(即在您的测试控制台中)来指示您的显卡是否正确编译着色器?如果你什么都看不到,做一个简单的 std::cout
标签: c++ opengl visual-studio-2012