2016-05-14 43 views
2

當我試圖用glCreateShader創建着色器和運行我的程序,我剛纔的窗口變成了白色,並給我一個錯誤:的OpenGl glCreateShader使窗口白色和給出了一個錯誤

異常在0x03D312F0拋出(atioglxx .dll)在OpenGl.exe中:0xC0000005:訪問衝突讀取位置0x73553A43。

有誰知道,爲什麼會發生這種情況? 這裏是我的代碼

#include <GL/glew.h> 
#include <GLFW\glfw3.h> 

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



int main() 
{ 
float speed = 0.005; 
float edge = 3.0; 
float move = 0.0; 
float zamik = 0.1; 

GLFWwindow *window; 
// initialize GLFW 
if (!glfwInit()) 
{ 
    return -1; 
} 

// create a window mode and its OpenGl context 
window = glfwCreateWindow(640, 480, "Window", NULL, NULL); 

if (!window) 
{ 
    glfwTerminate(); 
    return -1; 
} 

//make the windows contex current 
glfwMakeContextCurrent(window); 

glewInit(); 
GLenum err = glewInit(); 
if (GLEW_OK != err) 
{ 
    /* Problem: glewInit failed, something is seriously wrong. */ 
    fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); 

} 



GLfloat verts[] = 
{ 
    0.0f, 0.5f, 0.0f, 
    -0.5f, -0.5f, 0.0f, 
    0.5f, -0.5f, 0.0f 
}; 


/*GLfloat color[] = 
{ 
    255, 0, 0, 
    100, 255, 0, 
    0, 0, 255, 
    255, 255, 255 
};*/ 

GLuint vertexShader; 
vertexShader = glCreateShader(GL_VERTEX_SHADER); 

glShaderSource(vertexShader, 1, "C:\Users\Ghost.corp\Documents\Visual Studio 2015\Projects\OpenGl\OpenGl\VertexShader.shdVertx", NULL); 
//glCompileShader(vertexShader); 




glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
glfwWindowHint(GLFW_OPENGL_PROFILE, 0); 
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 
glfwWindowHint(GLFW_SAMPLES, 4); 

//loop 

while (!glfwWindowShouldClose(window)) 
{ 
    //clears our screen 
    glClear(GL_COLOR_BUFFER_BIT); 

    //render opengl content 
    glEnableClientState(GL_VERTEX_ARRAY); 
    //glEnableClientState(GL_COLOR_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, verts); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

    //glDisableClientState(GL_COLOR_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    //sweap front and back buffers 
    glfwSwapBuffers(window); 

    glfwPollEvents(); 
    //glColorPointer(4, GL_FLOAT, 0, color); 

} 

glfwTerminate(); 
return -1; 
} 

在glCreateShader精礦,如果我傳遞的參數錯誤。否則我不知道。

+0

我不使用'glfw',所以我不能幫忙。但看到你在調用'glCreateShader'之後定義了GL版本和上下文,就會出現錯誤。在設置上下文/版本之後GL總是必須來。 – aslg

+0

好吧,我會嘗試。如果它有效,我會發一個帖子。 – Alenprintf

回答

5

glCreateShader看起來不錯。但對於下一行,您應該首先閱讀着色器文件。 glShaderSource需要着色器內容,而不是路徑。一個例子是:

char *vs_source = 
    "attribute vec3 pos;\n" 
    "void main() {\n" 
    " gl_Position = vec4(pos,1.0);\n" 
    "}\n"; 
glShaderSource(vertexShader, 1, (const GLchar**)&vs_source, NULL); 

因此,首先讀取文件並將內容放入一個字符串,然後將其傳遞給此函數。

加載在C文件,是有點混亂,所以你需要像這樣的一個功能:

int load_file(const char *filename, char **result) 
{ 
    int size = 0; 
    FILE *f = fopen(filename, "rb"); 
    if (f == NULL) 
    { 
     *result = NULL; 
     return -1; // -1 means file opening fail 
    } 
    fseek(f, 0, SEEK_END); 
    size = ftell(f); 
    fseek(f, 0, SEEK_SET); 
    *result = (char *)malloc(size+1); 
    if (size != fread(*result, sizeof(char), size, f)) 
    { 
     free(*result); 
     return -2; // -2 means file reading fail 
    } 
    fclose(f); 
    (*result)[size] = 0; 
    return size; 
} 

然後,你可以這樣使用它:

char *vs_source; 
int size; 
size = load_file("C:\\Users\\Ghost.corp\\Documents\\Visual Studio 2015\\Projects\\OpenGl\\OpenGl\\VertexShader.shdVertx", &vs_source); 
glShaderSource(vertexShader, 1, (const GLchar**)&vs_source, NULL); 

你可能會檢查返回的size以查看加載文件沒有問題。另外,當你使用C時,你需要記住釋放你創建的新內存。如果你沒有釋放它,你會有內存泄漏。

資源:
加載文件的功能是從here拍攝。

+0

所以你認爲問題出在C:\ Users \ Ghost.corp \ Documents \ Vis ....定義頂點着色器的位置? – Alenprintf

+0

是的,該行應該是你的問題的來源。如果你想從一個文件加載着色器,你可以看看這個例子[here](http://www.nexcius.net/2012/11/20/how-to-load-a-glsl-shader -in-OpenGL的使用-C /)。 –

+0

謝謝,我會檢查它,我們會看看它是否工作 – Alenprintf

相關問題