GLSL 简单示例在 OSX 上显示空白屏幕
GLSL Simple example shows blanks screen on OSX
我正在尝试制作一个简单的程序来运行。我正在使用 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。所以我确定我得到了正确的配置文件。
我试过 headers。看来我不需要库来获取扩展名称,Apple 似乎已经拥有它们继承人 OpenGL headers。
完整的程序有一些例程可以在 creating/linking 着色器时处理错误,我可以告诉他们它们没有失败 compile/link。
程序应该在屏幕中间显示一个点,但除了白色屏幕(清晰的颜色)外什么也没有显示。
知道我遗漏了什么或做错了什么吗?
好的。我成功了。
问题出在这一行:
glGenVertexArraysAPPLE(numVAOs, vao);
glBindVertexArrayAPPLE(vao[0]);
出于某种原因,这些应用程序的 APPLE 版本不起作用。
我所做的是:
- 用 brew 安装 GLEW(我认为我不需要)
- 将我的 cmake 文件更新为 link glew 正确
- 添加 glew headers 和
glew_init()
- 将 APPLE 函数替换为“正常”函数。
glGenVertexArrays(numVAOs, vao);
glBindVertexArray(vao[0]);
现在程序显示points/triangles
希望这对以后的其他人有所帮助。
我正在尝试制作一个简单的程序来运行。我正在使用 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。所以我确定我得到了正确的配置文件。
我试过 headers。看来我不需要库来获取扩展名称,Apple 似乎已经拥有它们继承人 OpenGL headers。
完整的程序有一些例程可以在 creating/linking 着色器时处理错误,我可以告诉他们它们没有失败 compile/link。
程序应该在屏幕中间显示一个点,但除了白色屏幕(清晰的颜色)外什么也没有显示。
知道我遗漏了什么或做错了什么吗?
好的。我成功了。
问题出在这一行:
glGenVertexArraysAPPLE(numVAOs, vao);
glBindVertexArrayAPPLE(vao[0]);
出于某种原因,这些应用程序的 APPLE 版本不起作用。 我所做的是:
- 用 brew 安装 GLEW(我认为我不需要)
- 将我的 cmake 文件更新为 link glew 正确
- 添加 glew headers 和
glew_init()
- 将 APPLE 函数替换为“正常”函数。
glGenVertexArrays(numVAOs, vao);
glBindVertexArray(vao[0]);
现在程序显示points/triangles
希望这对以后的其他人有所帮助。