c语言opengl
⑴ c语言如何用OpenGL
OpenGL就是基于C语言的,只需要下载OpenGL的SDK库安装即可,在编写源码时:
1、添加头文件glut.h。
注意glut.h文件中已经包含gl.h,glu.h在实际编译中可以只加入头文件glut.h,很多相关的例子都是这样的,但是在mingwstudio上编译发现,在glut.h前还是需要加入glu.h, gl.h.如:
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
2、在工程中添加OpenGL的库,有关命令行加入,glu32 opengl32 glut32库就可以编译了。
⑵ OpenGL ES基础理论 (一) —— 缓存、帧缓存、上下文与坐标系等
程序会将3D场景数据保存到硬件RAM中,嵌入式系统的中央处理单元有专门为其分配的RAM,在图形处理的过程中,GPU也有专门为其分配的RAM,使用现代硬件渲染3D图形的速度几乎弯完全取决于不用的内存区块被访问的方式。
先看一下下图。
OpenGL ES 是 一 种 软 件 技 术。OpenGL ES 部分运行在 CPU 上,部分运行在 GPU 上。 OpenGL ES 横跨在两个处理器之间,协调两个内存区域之间的数据交换。上图中箭头代表了与3D渲染相关硬件组件之间的数据交换,每个箭头也代表着一个渲染性能的瓶颈。
从一个内存区域复制数据到另一个内存区域速度是相对较慢的。更糟糕的是,除非非常小心,在内存复制发生的时候 GPU 和 CPU 都不能把内存另作它用。因此内存区域之间的数据交换需要尽量避免。
最新的 OpenGL ES 为了支持新改进的方法抛弃了对于旧式的低效的内存复制操作的支持。
OpenGL ES 为两个内存区域间的数据交换定义了 缓存(buffers) 的概念。缓存是指图形处理器能够控制和管理的连续 RAM。程序从 CPU 的内存复制数据到 OpenGL ES 的缓存。在 GPU 取得一个缓存的所有权以后,运行在 CPU 中的程序理想情况下将不 再接触这个缓存。通过控制独占的缓存,GPU 就能够尽可能以最有效的方式读写内存。 图形处理器把它处理大量数据的能力异步同时地应用到缓存上,这意味着在 GPU 使用 缓存中的数据工作的同时,运行在 CPU 中的程序可以继续执行。
几乎所有的程序提供给GPU的数据都应该放入缓存中,为缓存提供数据,需要如下7个步骤:
理想情况下,每个生成的缓存都可以使用一个相当长的时间。下面看一下上面几个步骤的OpenGL ES的C语言函数的实现。
GPU 需要知道应该在内存中的哪个位置存储渲染出来的 2D 图像像素数据。就像 为 GPU 提供数据的缓存一样,接收渲染结果的缓冲区叫做帧缓存 (frame buffer) 。程 序会像任何其他种类的缓存一样生成、绑定、删除帧缓存。但是帧缓存不需要初始 化,因为渲染指令会在适当的时候替换缓存的内容。帧缓存会在被绑定的时候隐式开 启,同时 OpenGL ES 会自动地根据特定平台的硬件配置和功能来设置数据的类型和偏移。
可以同时存在很多帧缓存,并且可以通过 OpenGL ES 让 GPU 把渲染结果存储到 任意数量的帧缓存中。但是,屏幕显示像素要受到保存在前帧缓存 (front frame buffer) 的特定帧缓存中的像素颜色元素的控制。程序和操作系统很少会直接渲染到前帧缓存中,因为那样会让用户看到正在渲染中的还没渲染完成的图像。相反,程序和操作系统 会把渲染结果保存到包括后帧缓存 (back frame buffer) 在内的其他帧缓存中。当渲染后的后帧缓存包含一个完成的图像时,前帧缓存与后帧缓存几乎会瞬间切换。后帧缓存会变成新的前帧缓存,同时旧的前帧缓存会变成后帧缓存。
用于配置 OpenGL ES 的保存在特定平台的软件数据结构中的信息会被封装到一个 OpenGL ES 上下文(context)中。上下文中的 信息可能会被保存在 CPU 所控制的内存中,也可能会被保存在 GPU 所控制的内存中。 OpenGL ES 会按需在两个内存区域之间复制信息,知道何时发生复制有助于程序的优化。
OpenGL ES 总是开始于一个矩 形的笛卡儿坐标系,如下图所示。
OpenGL ES 坐标是以浮点数来存储的。现代 GPU 对浮点运算做了专门的优化,即 使是使用其他数据类型的顶点也会被转换成浮点值。
⑶ C语言我用OpenGL画了个圆,如何定义圆心坐标
opengl应该有自带的画圆或椭圆函数,为什么要自己描点?
你把x和y的值都加上一个数字,或者x或y乘除一个数字试试
⑷ OpenGL 跟java C# 或是其他的C 语言有什么本质上的不同吗
OpenGL不是编程语言,和微软的DirectX是两大主流的三维图形渲染接口。由一系列.dll,.lib和.h文件组成。编程的时候,用到.h里面的函数。那里面有很多绘制函数和状体控制函数。
它是由C编写的,完全可以融合到C++程序中。
java,C#,C是语言,就像中文、英文和法语,Opengl就像用中文写的孙子兵法。
⑸ OpenGL简介
上一节已经搭建好了开发环境,在正式学习如何用OpenGL前,我们先了解一下OpenGL的基础知识。
一、OpenGL是什么
一般它被认为是一个API,包含了一系列的函数,用来操作各种图形图像。事实上并不是,OpenGL仅仅是一个由一个名为Khronos组织制定并维护的规范。但是,我宁愿把它当成是API来理解,因为规范严格规定了OpenGL各函数的输入和输出,内部细节都是开发者自行决定。那么以API来理解,我认为是很合理的。(其实OpenGL函数大多是各显卡厂商开发的,所以如果你在用OpenGL开发过程中如果遇到问题,可以尝试更新显卡驱动的方式来解决,当然,前提是你还要确定一下显卡厂商)
如果你想了解OpenGL规范细节,可以访问https://www.opengl.org/registry/doc/glspec33.core.20100311.withchanges.pdf。
二、状态机
OpenGL是一个状态机,无论是官方信息还是网络上的信息,都解释的比较繁琐和复杂。
我认为,可以这么理解,当我们用OpenGL去绘制一个三角形时,要把OpenGL当前状态设置成可以绘制三角形的状态,比如颜色、线条啥的,渲染就出来三角形了。如果又想绘制线段了,就把OpenGL当前状态再设置成线段的状态,就可以渲染出线段了。
说白了,就是想绘制啥,就把状态设置先设置成啥,这就是状态机。(这是我自己理解的,哈哈)
三、核心模式与立即渲染模式
OpenGL3.2之前,它都是立即渲染模式,3.2之后,它使用了核心模式,抛弃了立即渲染模式。
那么什么是立即渲染模式,什么是核心模式呢?
我查了网上很多资料,都没有把这个事情说清楚,我通过各种文章,是这么理解的:
立即渲染模式是类似这样:
glBegin( GL_TRIANGLES );
glVertex3f(-1.0f, -0.5f, -4.0f);
glVertex3f( 1.0f, -0.5f, -4.0f);
glVertex3f( 0.0f, 0.5f, -4.0f);
glEnd();
上面是绘制三角形的,具体可以不用追究。只要明白,设置好点,放在glBegin和glEnd之间,就能渲染出来三角形了。这就是立即渲染模式。
而核心模式就要关注细节了,它是如何用点和颜色渲染图形的,都需要开发者参与设计。
暂时我就理解到这个程度,后续边学边理解吧。
四、对象
OpenGL库是用C语言写的,我们知道C语言是面向过程的,之前的OpenGL也是面向过程的,比如,绘制一个图形,就要设置好顶点和颜色,如果再绘制一个,就要再设置一次。而OpenGL引入“对象(Object)”后,就方便多了。比如:
// 创建对象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);
上面这段是在网上抄过来的,不过,说明很详细,我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文(就是设置内容,比如颜色、大小等等)的目标位置(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。
说白了,就是,创建一个对象,先用一个ID保存起来,并设置好内容,想用了,将这个ID跟设置目标(比如GL_WINDOW_TARGET)绑定,就可以用了,不用每次都重新设置。
好了,这次了解了一些OpenGL的基础,下一次就可以开心正式学习OpenGL了。
⑹ 求一个C语言Opengl代码
// Bounce.c
// Demonstrates a simple animated rectangle program with GLUT
// OpenGL SuperBible, 2nd Edition
// Richard S. Wright Jr.
#include"stdafx.h"
#include <windows.h>
#include <gl/glut.h>
// Initial square position and size
GLfloat x1 = 100.0f;
GLfloat y1 = 150.0f;
GLsizei rsize = 50;
// Step size in x and y directions
// (number of pixels to move each time)
GLfloat xstep = 1.0f;
GLfloat ystep = 1.0f;
// Keep track of windows changing width and height
GLfloat windowWidth;
GLfloat windowHeight;
// Called to draw scene
void RenderScene(void)
{
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT);
// Set current drawing color to red
// R G B
glColor3f(1.0f, 0.0f, 0.0f);
// Draw a filled rectangle with current color
glRectf(x1, y1, x1+rsize, y1+rsize);
// Flush drawing commands
glutSwapBuffers();
}
// Called by GLUT library when idle (window not being
// resized or moved)
void TimerFunction(int value)
{
// Reverse direction when you reach left or right edge
if(x1 > windowWidth-rsize || x1 < 0)
xstep = -xstep;
// Reverse direction when you reach top or bottom edge
if(y1 > windowHeight-rsize || y1 < 0)
ystep = -ystep;
// Check bounds. This is incase the window is made
// smaller and the rectangle is outside the new
// clipping volume
if(x1 > windowWidth-rsize)
x1 = windowWidth-rsize-1;
if(y1 > windowHeight-rsize)
y1 = windowHeight-rsize-1;
// Actually move the square
x1 += xstep;
y1 += ystep;
// Redraw the scene with new coordinates
glutPostRedisplay();
glutTimerFunc(33,TimerFunction, 1);
}
// Setup the rendering state
void SetupRC(void)
{
// Set clear color to blue
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
// Called by GLUT library when the window has chanaged size
void ChangeSize(GLsizei w, GLsizei h)
{
// Prevent a divide by zero
if(h == 0)
h = 1;
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Keep the square square, this time, save calculated
// width and height for later use
if (w <= h)
{
windowHeight = 250.0f*h/w;
windowWidth = 250.0f;
}
else
{
windowWidth = 250.0f*w/h;
windowHeight = 250.0f;
}
// Set the clipping volume
glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
// Main program entry point
void main(void)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("Bounce");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutTimerFunc(33, TimerFunction, 1);
SetupRC();
glutMainLoop();
}
//是正方形的,你改一下吧~
程序还是自己试着编,这样才会进步,加油哈!
⑺ 用Opengl(c语言)编程
当年我也做过这个程序,只是代码不在了。
⑻ 求助C语言高手,关于openGL的
应该是系统文件放的地方不对,
你试一下这样:
把GL头文件(.h文件)放在vc++6.0(安放的地方)的include文件夹中,
GL的lib文件放vc++6.0(安放的地方)的lib文件夹中,
dll文件放windows/system32里。这三个文件我有,你不行再问我~
⑼ C语言windows,OpenGL编程
查找 MSDN 可以得知,MSG 里面的 pt 坐标是相对于窗口的左上角的;
2. 至于声音控制和播放,可以使用 Windows 自带的 MCI API,或者使用 DirectSound 来播放,我推荐你使用 un4seen 的 BASS,简单实用强大,一两个函数就可以播放音效了;
3. 你要使用 alpha blend 与桌面进行镂空运算,就必须首先获得桌面的窗体句柄,OpenGL 的 alppha 运算我不是很懂,不过 Direct3D 的话就简单多了;
4. 屏幕常亮,其实就是阻止系统进入休眠状态,每当系统要进入休眠状态之前,都会向系统的所有窗口发送一条消息,你拦截这条消息,进行特别的处理就可以防止系统进入休眠了,至于是什么消息,请查看 MSDN,我也好久没用过这条消息了;
5.bmp 文件可以保存 alpha 通道,使用 32bit 色深的 bmp 文件就可以了,RGB 分别 8bit,alpha 通道 8bit,不过说到 alpha 通道,tga 或者 png 图片更加合适,因为他们可以进行无损压缩;
6.用GetPocAddress导出函数,只能用类型强制转换,这个是 windows 的原则,我们只能去迎合它了 ...
7. 执行 NULL 指针的话,不同的系统会有不同的反应,XP 是直接程序崩溃,Vista 或者以上的系统,就会提示无响应
8. 如果你建立的工程是 Win32 窗口程序,那么就不会有 DOS 窗口,如果你建立的是 Win32 控制台程序,那么就会有 DOS 窗口;如果你使用 OpenGL 实用库来创建 OpenGL 程序,那个 DOS 窗口是无法消除的,它可以帮助你进行错误排查
9. 不要用 Dev C++ 了,用 VS2010 吧,这是行业规范
最后,祝楼主学习愉快
⑽ opengl 用在C语言中时 程序里面使用的哪种基本数据类型
openGL自己有自己定义的类型和c语言的基础类型对应。
当然openGL没有规定必须要用他自己定义的类型。所以你完全可以用c语言里面的基本类型。
反正用来用去都是一样。
就是你如果用C的类型可能到不同的编译器或系统所占的内存有所不一样可能同样的程序在不同的编译器或系统中效果不一样。
而openGL库自己的类型则可以稍微避过这一点,达到一个“跨平台适配”的效果。