用c语言opengl画一幅图片,C OpenGL,GLFW绘制一个简单的立方体

所以,我试图在openGL和GLFW中绘制一个简单的立方体.

在下面的代码中,我可以绘制立方体,但它只是一个简单的矩形.这里发生了什么?

我尝试过“glTransformf(0,0,-10);”但是如果我做的事情少于-2,那么立方体会消失.在-2,正面出现.在默认位置0,我可以看到立方体的背面.

此外,当我尝试旋转它时,显示的所有内容都是一个从窗口顶部移动到底部的矩形.看起来很奇怪.

任何人都可以帮我找出程序这样做的原因吗?

#if defined(_WIN32) || defined(_WIN64)

#include

#endif

#include

#include

#include

#include

#define GLEW_STATIC

#include

#include

#include

const char* gameTitle = "TEST";

GLFWwindow* window;

GLfloat vertices[] =

{

-1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1,

1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1,

-1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, -1,

-1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1,

-1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1,

-1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1

};

GLfloat colors[] =

{

0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,

1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0,

0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,

0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,

0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0,

0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1

};

static void controls(GLFWwindow* window, int key, int scancode, int action, int mods)

{

if(action == GLFW_PRESS)

if(key == GLFW_KEY_ESCAPE)

glfwSetWindowShouldClose(window, GL_TRUE);

}

bool initWindow(const int resX, const int resY)

{

if(!glfwInit())

{

fprintf(stderr, "Failed to initialize GLFW\n");

return false;

}

glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing

// Open a window and create its OpenGL context

window = glfwCreateWindow(resX, resY, gameTitle, NULL, NULL);

if(window == NULL)

{

fprintf(stderr, "Failed to open GLFW window.\n");

glfwTerminate();

return false;

}

glfwMakeContextCurrent(window);

glfwSetKeyCallback(window, controls);

// Get info of GPU and supported OpenGL version

printf("Renderer: %s\n", glGetString(GL_RENDERER));

printf("OpenGL version supported %s\n", glGetString(GL_VERSION));

glEnable(GL_DEPTH_TEST); // Depth Testing

glDepthFunc(GL_LEQUAL);

glDisable(GL_CULL_FACE);

glCullFace(GL_BACK);

return true;

}

static void drawCube()

{

static float alpha = 0;

glMatrixMode(GL_PROJECTION_MATRIX);

glLoadIdentity();

glTranslatef(0,0,-2);

glMatrixMode(GL_MODELVIEW_MATRIX);

//attempt to rotate cube

//glRotatef(alpha, 1, 0, 0);

/* We have a color array and a vertex array */

glEnableClientState(GL_VERTEX_ARRAY);

glEnableClientState(GL_COLOR_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, vertices);

glColorPointer(3, GL_FLOAT, 0, colors);

/* Send data : 24 vertices */

glDrawArrays(GL_QUADS, 0, 24);

/* Cleanup states */

glDisableClientState(GL_COLOR_ARRAY);

glDisableClientState(GL_VERTEX_ARRAY);

alpha += 0.1;

}

static void display()

{

glClearColor(0.0, 0.8, 0.3, 1.0);

while(!glfwWindowShouldClose(window))

{

// Draw stuff

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

drawCube();

// Update Screen

//glFlush();

glfwSwapBuffers(window);

// Check for any input, or window movement

glfwPollEvents();

// Scale to window size

GLint windowWidth, windowHeight;

glfwGetWindowSize(window, &windowWidth, &windowHeight);

glViewport(0, 0, windowWidth, windowHeight);

}

}

int main(int argc, char** argv)

{

if(initWindow(1024, 620))

{

display();

}

printf("Goodbye!\n");

glfwDestroyWindow(window);

glfwTerminate();

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一名语言模型AI,不具备图形编程能力。但是,我可以提供一段基于OpenGLGLFW的代码示例,用于创建一个显示立方体的窗口: ``` #include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } void processInput(GLFWwindow *window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); } 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, "OpenGL Window", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } glViewport(0, 0, 800, 600); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); while (!glfwWindowShouldClose(window)) { processInput(window); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // draw a cube glBegin(GL_QUADS); glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); glVertex3f(0.5f, -0.5f, 0.5f); glVertex3f(0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, 0.5f, 0.5f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glVertex3f(-0.5f, 0.5f, -0.5f); glVertex3f(0.5f, 0.5f, -0.5f); glVertex3f(0.5f, -0.5f, -0.5f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); glVertex3f(-0.5f, 0.5f, 0.5f); glVertex3f(0.5f, 0.5f, 0.5f); glVertex3f(0.5f, 0.5f, -0.5f); glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glVertex3f(0.5f, -0.5f, -0.5f); glVertex3f(0.5f, -0.5f, 0.5f); glVertex3f(-0.5f, -0.5f, 0.5f); glColor3f(0.0f, 1.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f); glVertex3f(0.5f, 0.5f, -0.5f); glVertex3f(0.5f, 0.5f, 0.5f); glVertex3f(0.5f, -0.5f, 0.5f); glColor3f(1.0f, 0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glVertex3f(-0.5f, -0.5f, 0.5f); glVertex3f(-0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, 0.5f, -0.5f); glEnd(); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; } ``` 此代码创建一个800 x 600的窗口,并在其中绘制一个立方体。请注意,此代码使用了旧版本的OpenGL命令,因此不是最优的实现方式。如果要使用现代OpenGL,则需要使用顶点缓冲对象、着色器和VAO等工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值