【发布时间】:2020-10-26 01:46:25
【问题描述】:
我正在尝试制作一个简单的程序来工作。我正在使用 SD2 + OpenGL 着色语言。另外,我正在 MacOS 上尝试这个,更准确地说是 10.15.5。 我知道 Apple 正在弃用 OpenGL 以支持 Metal,但似乎它们仍然支持至少 OpenGL 4.1。
这是我尝试运行的程序的简化版本:
#include <OpenGL/glext.h>
#include <OpenGL/glu.h>
#include <SDL.h>
#include <iostream>
const int WIDTH = 600;
const int HEIGHT = 600;
const int numVAOs = 1;
GLuint renderingProgram;
GLuint vao[numVAOs];
GLuint createShaderProgram() {
GLint vertCompiled;
GLint fragCompiled;
GLint linked;
const char *vshaderSource =
"#version 410\n"
"void main(void)\n"
"{gl_Position = vec4(0.0, 0.0, 0.0, 1.0); }";
const char *fshaderSource =
"#version 410\n"
"out vec4 color; \n"
"void main(void)\n"
"{color = vec4(1.0, 0.0, 0.0, 1.0);}";
GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vShader, 1, &vshaderSource, NULL);
glShaderSource(fShader, 1, &fshaderSource, NULL);
glCompileShader(vShader);
glCompileShader(fShader);
GLuint vfProgram = glCreateProgram();
glAttachShader(vfProgram, vShader);
glAttachShader(vfProgram, fShader);
glLinkProgram(vfProgram);
return vfProgram;
}
int main() {
SDL_Window *window;
SDL_GLContext gl_context;
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
return -1;
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
window = SDL_CreateWindow(
"OpenGL Shaders",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
WIDTH,
HEIGHT,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
gl_context = SDL_GL_CreateContext(window);
std::cout << glGetString(GL_VERSION) << std::endl;
renderingProgram = createShaderProgram();
glGenVertexArraysAPPLE(numVAOs, vao);
glBindVertexArrayAPPLE(vao[0]);
bool isRunning = true;
SDL_Event event;
while (isRunning) {
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
isRunning = false;
break;
}
}
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(renderingProgram);
glPointSize(30.0f);
glDrawArrays(GL_POINTS, 0, 1);
SDL_GL_SwapWindow(window);
}
SDL_GL_DeleteContext(gl_context);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
这仅显示一个空白屏幕,并在控制台上打印 4.1 ATI-3.9.15。所以我确信我得到了正确的个人资料。
我尝试过使用标题。看来我不需要库来获取扩展名,似乎 Apple 已经将它们包含在继承的 OpenGL 头文件中。
完整的程序有一些在创建/链接着色器时处理错误的例程,我可以告诉他们没有编译/链接失败。
程序应该在屏幕中间显示一个点,但除了白色屏幕(清晰的颜色)之外什么都不显示。
知道我错过了什么或做错了什么吗?
【问题讨论】:
-
您是否有理由将 APPLE 扩展用于 VAO 而不是核心版本?调用
glGetError()时有没有报错? -
没有理由。这就是我发现可用的。 glGetError 没有收到任何错误
标签: c++ macos opengl glsl sdl-2