我遵循本教程:https://www.youtube.com/watch?v=0CQP8huwLCg
我在Mac上使用XCode而不是Windows VS.我把所有东西都联系在了一起。但是,我已弃用函数调用。另外,我的fseek(fp,0,SEEK_END);由于某种原因返回NULL。谁能告诉我如何修复弃用调用以及我可以在哪里找到更新的API?第二,为什么fseek返回null?我在同一个文件夹中有vsh和fsh文件......
这是在Mac上使用它的main.cpp代码:
#ifdef __APPLE_CC__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#endif
#include <stdio.h>
#include <iostream>
using namespace std;
static char* readFile(const char* filename) {
// Open the file
FILE* fp = fopen (filename, "r");
// Move the file pointer to the end of the file and determing the length
fseek(fp, 0, SEEK_END);
long file_length = ftell(fp);
fseek(fp, 0, SEEK_SET);
char* contents = new char[file_length+1];
// zero out memory
for (int i = 0; i < file_length+1; i++) {
contents[i] = 0;
}
// Here's the actual read
fread (contents, 1, file_length, fp);
// This is how you denote the end of a string in C
contents[file_length+1] = '\0';
fclose(fp);
return contents;
}
GLuint makeVertexShader(const char* shaderSource) {
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
glShaderSource (vertexShaderID, 1, (const GLchar**)&shaderSource, NULL);
glCompileShader(vertexShaderID);
return vertexShaderID;
}
GLuint makeFragmentShader(const char* shaderSource) {
GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShaderID, 1, (const GLchar**)&shaderSource, NULL);
glCompileShader(fragmentShaderID);
return fragmentShaderID;
}
GLuint makeShaderProgram (GLuint vertexShaderID, GLuint fragmentShaderID) {
GLuint shaderID = glCreateProgram();
glAttachShader(shaderID, vertexShaderID);
glAttachShader(shaderID, fragmentShaderID);
glLinkProgram(shaderID);
return shaderID;
}
int main (int argc, char** argv) {
// Standard stuff...
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(800, 600);
glutCreateWindow("Shaders");
//glewInit(); //only use for Windows platform
char* vertexShaderSourceCode = readFile("vertexShader.vsh");
char* fragmentShaderSourceCode = readFile("fragmentShader.fsh");
GLuint vertShaderID = makeVertexShader(vertexShaderSourceCode);
GLuint fragShaderID = makeFragmentShader(fragmentShaderSourceCode);
GLuint shaderProgramID = makeShaderProgram(vertShaderID, fragShaderID);
glUseProgram(shaderProgramID);
printf ("vertShaderID is %d\n", vertShaderID);
printf ("fragShaderID is %d\n", fragShaderID);
printf ("shaderProgramID is %d\n", shaderProgramID);
glDeleteProgram(shaderProgramID);
int temp;
scanf ("%d", &temp);
return 0;
}
然后,这是vertexShader.vsh文件:
in vec4 s_vPosition;
void main () {
// Look, Ma! I avoided any matrix multiplication!
// The value of s_vPosition should be between -1.0 and +1.0 (to be visible on the screen)
gl_Position = s_vPosition;
}
然后,fragmentShader.fsh:
out vec4 s_vColor;
void main () {
// No matter what, color the pixel red!
fColor = vec4 (1.0, 0.0, 0.0, 1.0);
}
答案 0 :(得分:1)
fseek (...)
应该在成功时返回 0 (NULL),这是完全可以理解的。如果ftell (...)
返回非零值,那么一切都很好。
&#34;它提供了错误的访问错误&#34;
首先,不要打扰归零内存。唯一重要的零是您在fclose (...)
之上添加的零。这个过程不仅非常低效,而且你添加NULL终结符的行也是你问题的根源。
您已经分配了一个file_length+1
字节的数组,然后尝试使用数组下标[file_length+1]
添加一个NULL终止符。
这相当于以下表达式:*(contents + file_length + 1) = '\0'
,它将值'\0'
写入超出已分配内存末尾的1个字节。
我责怪new [...]
运算符,您可能已阅读第new char[file_length+1]
行并忘记数组索引从 0 开始。
// This is how you denote the end of a string in C
contents[file_length] = '\0';
顺便提一下,如果你选择保留将所有零写入分配内存的循环,你甚至不需要上面提到的那一行。我强烈建议你修改循环并修复你的数组下标。
对于已弃用的函数,不推荐使用任何内容。但是,您没有显示足够的代码来使这些着色器工作。至少你需要一个顶点属性指针。无论在何处完成,都可能是您弃用的函数错误的来源。