2012-09-08 78 views
3

我目前正在学习如何使用OpenGL for Windows。 要检查我是否正确设置库,我正在编译一组应该可以工作的教程。Opengl访问违反以下教程

现在即时通讯以下这组: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/

前面的教程编译很好,所以我相信我拥有了一切设置正确,但第二个保持拧我了,我真的不能找到任何问题我的设置也是。 我使用视觉表达C++ 2010

在源文件中我有:

main.cpp中:

// Include standard headers 
    #include <stdio.h> 
    #include <stdlib.h> 

// Include GLEW 
#include <GL/glew.h> 

// Include GLFW 
#include <GL/glfw.h> 

// Include GLM 
#include <glm/glm.hpp> 
using namespace glm; 

#include "shader.h" 

int main(void) 
{ 
// Initialise GLFW 
if(!glfwInit()) 
{ 
    fprintf(stderr, "Failed to initialize GLFW\n"); 
    return -1; 
} 

glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4); 
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); 
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3); 
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

// Open a window and create its OpenGL context 
if(!glfwOpenWindow(1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW)) 
{ 
    fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n"); 
    glfwTerminate(); 
    return -1; 
} 

// Initialize GLEW 
if (glewInit() != GLEW_OK) { 
    fprintf(stderr, "Failed to initialize GLEW\n"); 
    return -1; 
} 

glfwSetWindowTitle("Tutorial 02"); 

// Ensure we can capture the escape key being pressed below 
glfwEnable(GLFW_STICKY_KEYS); 

// Dark blue background 
glClearColor(0.0f, 0.0f, 0.3f, 0.0f); 

GLuint VertexArrayID; 
glGenVertexArrays(1, &VertexArrayID); 
glBindVertexArray(VertexArrayID); 

// Create and compile our GLSL program from the shaders 
GLuint programID = LoadShaders("SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader"); 


static const GLfloat g_vertex_buffer_data[] = { 
    -1.0f, -1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 
}; 

GLuint vertexbuffer; 
glGenBuffers(1, &vertexbuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); 

do{ 

    // Clear the screen 
    glClear(GL_COLOR_BUFFER_BIT); 

    // Use our shader 
    glUseProgram(programID); 

    // 1rst attribute buffer : vertices 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 
    glVertexAttribPointer(
     0,     // attribute 0. No particular reason for 0, but must match the layout in the shader. 
     3,     // size 
     GL_FLOAT,   // type 
     GL_FALSE,   // normalized? 
     0,     // stride 
     (void*)0   // array buffer offset 
    ); 

    // Draw the triangle ! 
    glDrawArrays(GL_TRIANGLES, 0, 3); // From index 0 to 3 -> 1 triangle 

    glDisableVertexAttribArray(0); 

    // Swap buffers 
    glfwSwapBuffers(); 

} // Check if the ESC key was pressed or the window was closed 
while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS && 
     glfwGetWindowParam(GLFW_OPENED)); 

// Close OpenGL window and terminate GLFW 
glfwTerminate(); 

// Cleanup VBO 
glDeleteBuffers(1, &vertexbuffer); 
glDeleteVertexArrays(1, &VertexArrayID); 

return 0; 
} 

shader.cpp:

#include <stdio.h> 
#include <string> 
#include <vector> 
#include <iostream> 
#include <fstream> 
#include <algorithm> 
using namespace std; 

#include <stdlib.h> 
#include <string.h> 

#include <GL/glew.h> 

#include "shader.h" 

GLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path){ 

// Create the shaders 
GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); 
GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); 

// Read the Vertex Shader code from the file 
std::string VertexShaderCode; 
std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); 
if(VertexShaderStream.is_open()){ 
    std::string Line = ""; 
    while(getline(VertexShaderStream, Line)) 
     VertexShaderCode += "\n" + Line; 
    VertexShaderStream.close(); 
} 

// Read the Fragment Shader code from the file 
std::string FragmentShaderCode; 
std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); 
if(FragmentShaderStream.is_open()){ 
    std::string Line = ""; 
    while(getline(FragmentShaderStream, Line)) 
     FragmentShaderCode += "\n" + Line; 
    FragmentShaderStream.close(); 
} 



GLint Result = GL_FALSE; 
int InfoLogLength; 



// Compile Vertex Shader 
printf("Compiling shader : %s\n", vertex_file_path); 
char const * VertexSourcePointer = VertexShaderCode.c_str(); 
glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL); 
glCompileShader(VertexShaderID); 

// Check Vertex Shader 
glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); 
glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); 
std::vector<char> VertexShaderErrorMessage(InfoLogLength); 
glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); 
fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]); 




// Compile Fragment Shader 
printf("Compiling shader : %s\n", fragment_file_path); 
char const * FragmentSourcePointer = FragmentShaderCode.c_str(); 
glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL); 
glCompileShader(FragmentShaderID); 

// Check Fragment Shader 
glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); 
glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); 
std::vector<char> FragmentShaderErrorMessage(InfoLogLength); 
glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); 
fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); 




// Link the program 
fprintf(stdout, "Linking program\n"); 
GLuint ProgramID = glCreateProgram(); 
glAttachShader(ProgramID, VertexShaderID); 
glAttachShader(ProgramID, FragmentShaderID); 
glLinkProgram(ProgramID); 

// Check the program 
glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); 
glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); 
std::vector<char> ProgramErrorMessage(max(InfoLogLength, int(1))); 
glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); 
fprintf(stdout, "%s\n", &ProgramErrorMessage[0]); 


glDeleteShader(VertexShaderID); 
glDeleteShader(FragmentShaderID); 

return ProgramID; 
} 

在头我有:

shader.h:

#ifndef SHADER_H 
#define SHADER_H 

GLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path); 

#endif 

在资源文件我有:

SimpleFragmentShader.fragmentshader:

#version 330 core 

// Ouput data 
out vec3 color; 

void main() 
{ 

// Output color = red 
color = vec3(1,0,0); 

} 

SimpleVertexShader.vertexshader:

#version 330 core 

// Input vertex data, different for all executions of this shader. 
layout(location = 0) in vec3 vertexPosition_modelspace; 

void main(){ 

gl_Position.xyz = vertexPosition_modelspace; 

} 

调试:

链接: KERNEL32。 LIB; glu32.lib; glew32。 LIB; GLFW.lib; openGL32.lib; USER32.LIB; GDI32.LIB; winspool.lib; comdlg32.lib; advapi32.lib; SHELL32.LIB; ole32.lib; oleaut32.lib; UUID.LIB; odbc32.lib; odbccp32.lib;%(AdditionalDependencies)

最后,调试输出:

'Spacecraft.exe': Loaded 'C:\Users\Leif Andreas\Documents\Visual Studio 2010\Projects\Spacecraft\Debug\Spacecraft.exe', Symbols loaded. 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\glew32.dll', Binary was not built with debug information. 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\opengl32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\msvcrt.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\advapi32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\sechost.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\rpcrt4.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\sspicli.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\cryptbase.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\gdi32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\user32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\lpk.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\usp10.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\glu32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\ddraw.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\dciman32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\setupapi.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\cfgmgr32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\oleaut32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\ole32.dll', Symbols loaded. 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\devobj.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\dwmapi.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Cannot find or open the PDB file 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Cannot find or open the PDB file 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\imm32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\msctf.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\nvinit.dll', Cannot find or open the PDB file 
'Spacecraft.exe': Loaded 'C:\Program Files (x86)\NVIDIA Corporation\coprocmanager\detoured.dll', Cannot find or open the PDB file 
'Spacecraft.exe': Loaded 'C:\Program Files (x86)\NVIDIA Corporation\coprocmanager\Nvd3d9wrap.dll', Cannot find or open the PDB file 
'Spacecraft.exe': Loaded 'C:\Program Files (x86)\NVIDIA Corporation\coprocmanager\nvdxgiwrap.dll', Cannot find or open the PDB file 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\uxtheme.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\winmm.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\nvoglv32.dll', Cannot find or open the PDB file 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\shell32.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\shlwapi.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\version.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\ntmarta.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\Wldap32.dll', Symbols loaded (source information stripped). 
The thread 'Win32 Thread' (0x690) has exited with code 0 (0x0). 
'Spacecraft.exe': Loaded 'C:\Windows\SysWOW64\powrprof.dll', Symbols loaded (source information stripped). 
'Spacecraft.exe': Unloaded 'C:\Windows\SysWOW64\powrprof.dll' 
The thread 'Win32 Thread' (0x1e7c) has exited with code 0 (0x0). 
The thread 'Win32 Thread' (0x1f38) has exited with code 0 (0x0). 
First-chance exception at 0x00000000 in Spacecraft.exe: 0xC0000005: Access violation. 
Unhandled exception at 0x76fb15de (ntdll.dll) in Spacecraft.exe: 0xC0000005: Access violation. 
The program '[7988] Spacecraft.exe: Native' has exited with code -1073741819 (0xc0000005). 

回答

3

http://www.opengl-tutorial.org/miscellaneous/faq/#header-3

而且从教程1:

您也可以从内部启动任何教程Visual Studio,但你会 会需要先设置工作目录:右键点击 操场,选择调试,工作目录,浏览,并导航 到C:\ Users \ XYZ \ Projects \ OpenGLTutorials \ playground。验证。 再次右击Playground,选择“作为启动项目”。您现在可以通过按F5来调试代码。

enter image description here

我只是修改教程,因为有很多人被困在此。更重要的是,如果您使用GLEW的标准版本而不是本教程所包含的标准版本,则由于GLEW错误,您将无法使用Core Profile。使用

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); 

,而不是

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
+0

虽然此链接可以回答这个问题,最好是在这里有答案的主要部件,并提供链接以供参考。如果链接页面更改,则仅链接答案可能会失效。 – athspk

+0

谁赛伊夫我只会发布链接^^ – Calvin1602

+0

我没有写过以前的评论。它可能是从Review Task系统自动插入的。在我评论的那一刻,我看到的唯一的链接就是链接,所以我标记的答案被删除为“仅链接” – athspk