我编写了一个简单的OpenGL 3.3程序,它应该基于本教程渲染一个三角形,除了我使用GLFW创建窗口和上下文,而不是从头开始.另外,我正在使用Ubuntu.
虽然三角形没有渲染,但我只是得到一个黑屏.函数类似于glClearColor()
并且glClear()
似乎完全正常工作,但渲染三角形的代码却没有.以下是它的相关部分:
#define GLFW_INCLUDE_GL_3
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main ()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(800, 600, "GLFW test", NULL, NULL);
glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;
glewInit();
float vertices[] = {-0.5f, -0.5f, 0.0f, 0.5f, 0.5f, -0.5f};
GLuint VBOid[1];
glClear(GL_COLOR_BUFFER_BIT);
glGenBuffers(1, VBOid);
glBindBuffer(GL_ARRAY_BUFFER, VBOid[0]);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBOid[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
...
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我是使用make的新手,并且通过本教程学习了基础知识.这是教程中最后一个示例makefile示例:
IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR =../lib
LIBS=-lm
_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
Run Code Online (Sandbox Code Playgroud)
这应该可以正常工作,假设所有.c文件只包含hellomake.h,但如果每个.c文件包含不同的标题,它将无法正常工作.是否可以编写一个知道每个.c文件包含什么的makefile,所以我不必像以下那样手动执行:
foo.o: foo.c something.h
...
bar.o: bar.c somethingelse.h
...
Run Code Online (Sandbox Code Playgroud)
因为这似乎是浪费大量时间.
假设函数参数将在堆栈上顺序传递是否安全?
例如,无论编译器设置如何,都foo
保证输出x y z
?
void foo(int x, int y, int z) {
int *vector = &x;
for(int i = 0; i < 3; i++) {
std::cout << vector[i] << " ";
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用visual studio并且它确实有效,但我不确定这种行为是否得到保证.