⑴ openGL如何給一個球體紋理貼圖,並且當求轉動的時候,紋理要隨著球一起轉動,要c++的詳細代碼,重謝!
/*
*Copyright(c)1993-1997,SiliconGraphics,Inc.
*ALLRIGHTSRESERVED
*Permissiontouse,,modify,anddistributethissoftwarefor
*,providedthattheabove
*
*,andthat
*thenameofSiliconGraphics,Inc.notbeusedinadvertising
*,
*writtenpriorpermission.
*
*"AS-IS"
*ANDWITHOUTWARRANTYOFANYKIND,EXPRESS,IMPLIEDOROTHERWISE,
*INCLUDINGWITHOUTLIMITATION,
*FITNESSFORAPARTICULARPURPOSE.INNOEVENTSHALLSILICON
*GRAPHICS,INC.,
*SPECIAL,INCIDENTAL,
*KIND,ORANYDAMAGESWHATSOEVER,INCLUDINGWITHOUTLIMITATION,
*LOSSOFPROFIT,LOSSOFUSE,SAVINGSORREVENUE,ORTHECLAIMSOF
*THIRDPARTIES,WHETHERORNOTSILICONGRAPHICS,INC.HASBEEN
*,HOWEVERCAUSEDANDON
*ANYTHEORYOFLIABILITY,
*POSSESSION,.
*
*
*Use,plication,
*restrictionssetforthinFAR52.227.19(c)(2)orsubparagraph
*(c)(1)(ii)
*clauseatDFARS252.227-7013and/orinsimilarorsuccessor
*.
*Unpublished--
*UnitedStates.Contractor/manufacturerisSiliconGraphics,
*Inc.,2011N.ShorelineBlvd.,MountainView,CA94039-7311.
*
*OpenGL(R),Inc.
*/
#include<GL/glut.h>
#include<stdlib.h>
#include<stdio.h>
#definestripeImageWidth32
GLubytestripeImage[4*stripeImageWidth];
#ifdefGL_VERSION_1_1
staticGLuinttexName;
#endif
voidmakeStripeImage(void)
{
intj;
for(j=0;j<stripeImageWidth;j++){
stripeImage[4*j]=(GLubyte)((j<=4)?255:0);
stripeImage[4*j+1]=(GLubyte)((j>4)?255:0);
stripeImage[4*j+2]=(GLubyte)0;
stripeImage[4*j+3]=(GLubyte)255;
}
}
/**/
staticGLfloatxequalzero[]={1.0,0.0,0.0,0.0};
staticGLfloatslanted[]={1.0,1.0,1.0,0.0};
staticGLfloat*currentCoeff;
staticGLenumcurrentPlane;
staticGLintcurrentGenMode;
staticfloatroangles;
voidinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
makeStripeImage();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
#ifdefGL_VERSION_1_1
glGenTextures(1,&texName);
glBindTexture(GL_TEXTURE_1D,texName);
#endif
glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
#ifdefGL_VERSION_1_1
glTexImage1D(GL_TEXTURE_1D,0,GL_RGBA,stripeImageWidth,0,
GL_RGBA,GL_UNSIGNED_BYTE,stripeImage);
#else
glTexImage1D(GL_TEXTURE_1D,0,4,stripeImageWidth,0,
GL_RGBA,GL_UNSIGNED_BYTE,stripeImage);
#endif
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
currentCoeff=xequalzero;
currentGenMode=GL_OBJECT_LINEAR;
currentPlane=GL_OBJECT_PLANE;
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,currentGenMode);
glTexGenfv(GL_S,currentPlane,currentCoeff);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_1D);
//glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glFrontFace(GL_CW);
//glCullFace(GL_BACK);
glMaterialf(GL_FRONT,GL_SHININESS,64.0);
roangles=45.0f;
}
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(roangles,0.0,0.0,1.0);
#ifdefGL_VERSION_1_1
glBindTexture(GL_TEXTURE_1D,texName);
#endif
//glutSolidTeapot(2.0);
glutSolidSphere(2.0,32,32);
glPopMatrix();
glFlush();
}
voidreshape(intw,inth)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-3.5,3.5,-3.5*(GLfloat)h/(GLfloat)w,
3.5*(GLfloat)h/(GLfloat)w,-3.5,3.5);
else
glOrtho(-3.5*(GLfloat)w/(GLfloat)h,
3.5*(GLfloat)w/(GLfloat)h,-3.5,3.5,-3.5,3.5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
voididle()
{
roangles+=0.1f;
glutPostRedisplay();
}
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(256,256);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
glutIdleFunc(idle);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return0;
}
這是OpenGL紅寶書的例子,稍作改動,以顯示球體轉動時紋理是跟著動地。還有原來例子畫的是Teapot.。。。
⑵ 用OpenGL和C/C++製作的3D圖形用戶界面
OpenGL有紅寶書和藍寶書,網上能搜索到。網站就是NEHE的教程了。你搜索OPENGL NeHe就能找到。
OpenGL是C/C++的圖形庫,也是C/C++語言了。Oracle與OCI技術是與C/C++的資料庫編程的介面。
實戰OpenGL三維可視化系統開發與源碼精解:包括第1章三維圖形世界、第2章OpenGL概述和第3章Oracle與OCI技術及編程基礎。
⑶ openGL 程序運行後窗口裡面沒東西,已經不止一次了。下面是代碼,求解答。
先來回答你的問題。
無法顯示的原因,投影設置的視見體沒有將你定義的矩形模型包括在內。
直觀來講,你可以將gluOrtho2D試著調整為:
gluOrtho2D(-100,300.0,-100,300.0);同時設置背景為黑色,則得到效果:
進步一解釋:
OpenGL中圖形成像依賴於你定義的模型,比如你設置的4個position1
量以及投影時設置的投影參數,比如你用的gluOrtho2D。
你的代碼中模型和投影參數設置都不是很理想,使用gluOrtho2D設置的正交投影裁剪平面的范圍
(0,40.0,30.0,150.0);沒有將你要顯示的矩形模型包括在顯示區域內,因此無法渲染。
注意設置適當的參數,這是初學者需要耐心學習的。你的代碼看起來很混亂,最好採用一本適當教材(紅寶書),或者跟著一個教程(搜索 OpenGL tutorial)實際動手學習。
對於這個例子,同時思考:為什麼是三角形而不是矩形?
為什麼我之前的圖形沒有顯示出來?
⑷ 初學者學習opengl是用紅寶書好還是藍寶書好
聽同學推薦考研英語可以用紅寶書和藍寶書,比較靠譜,確實很好用,性價比超好。
⑸ OpenGL編程指南第八版VS2015怎麼配置
一、環境搭建指南
書中的地址
http://www.opengl-redbook.com/
去這里打包下載OpenGL紅寶書的示例代碼,解壓後是這樣
雖然沒有第一章的代碼但第一章的內容好歹算一個完整的例子,網上各種環境搭建教程也都以第一章的代碼為例,我們就拿過來直接用一下。
1、打開VS2015創建一個空的控制台項目,然後新建一個cpp文件,粘貼紅寶書第一章的示例代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
#include "vgl.h"
#include "LoadShaders.h"
enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };
GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];
const GLuint NumVertices = 6;
//---------------------------------------------------------------------
//
// init
//
void init(void)
{
glGenVertexArrays(NumVAOs, VAOs);
glBindVertexArray(VAOs[Triangles]);
GLfloat vertices[NumVertices][2] = {
{ -0.90, -0.90 }, // Triangle 1
{ 0.85, -0.90 },
{ -0.90, 0.85 },
{ 0.90, -0.85 }, // Triangle 2
{ 0.90, 0.90 },
{ -0.85, 0.90 }
};
glGenBuffers(NumBuffers, Buffers);
glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STATIC_DRAW);
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "triangles.vert" },
{ GL_FRAGMENT_SHADER, "triangles.frag" },
{ GL_NONE, NULL }
};
GLuint program = LoadShaders(shaders);
glUseProgram(program);
glVertexAttribPointer(vPosition, 2, GL_FLOAT,
GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(vPosition);
}
//---------------------------------------------------------------------
//
// display
//
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VAOs[Triangles]);
glDrawArrays(GL_TRIANGLES, 0, NumVertices);
glFlush();
}
//---------------------------------------------------------------------
//
// main
//
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(512, 512);
glutInitContextVersion(4, 3);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutCreateWindow(argv[0]);
glewExperimental = GL_TRUE;
if (glewInit()) {
cerr << "Unable to initialize GLEW ... exiting" << endl;
exit(EXIT_FAILURE);
}
init();
glutDisplayFunc(display);
glutMainLoop();
}
2、打開項目屬性,在「VC++ Directories」選項卡中,將前面下載回來的紅寶書示例代碼中的include目錄加入「Include Directories」,將lib目錄加入「Library Directories」
3、打開項目屬性,在「General」選項卡中,將「Platform Toolset」設置為VS2013
4、在項目管理器中右擊Source Files的Filter,添加現有項,然後找到紅寶書源碼目錄中的lib目錄,添加LoadShaders.cpp文件
5、打開項目屬性,在「Linker/Input」選項卡中,在「Ignore Specific Default Libraries」中添加libcmtd.lib
6、在項目目錄中新建兩個文本分別命名為triangles.vert和triangles.frag,也就是我們的頂點著色器和片段著色器啦
triangles.vert
1
2
3
4
5
6
7
#version 430 core
layout(location = 0) in vec4 vPosition;
void
main()
{
gl_Position = vPosition;
}
triangles.frag
1
2
3
4
5
6
7
#version 430 core
out vec4 fColor;
void
main()
{
fColor = vec4(0.0, 0.0, 1.0, 1.0);
}
7、編譯,運行,搞定
二、所以然
1、關於第一步
這里的示例代碼其實比書中的多了一句
glewExperimental = GL_TRUE;
書里的代碼用到了GLEW庫,GLEW可以跨平台支持OpenGL高級擴展特性,沒有GLEW的話在Win平台是無法使用4.3的那些功能的。這句
代碼是GLEW所有擴展的一個開關,需要在glewInit()之前執行。如果沒有這一句,編譯是可以通過的,但在運行時會崩潰。
2、關於第二步
主要目的是將示例代碼中用到的GLUT和GLEW庫的頭文件和庫文件引入項目目錄。這一步沒設置好的話編譯無法通過,現象一般是無法打開freeglut相關庫文件或者某些函數沒有聲明。
網上有些教程讓你自己去下載並編譯freeglut和glew,然後拷貝到各種系統目錄和VS的目錄,其實沒用。所有用到的頭文件和庫文件在第八版示例代碼include和lib目錄中都有了,你只要正確引入項目中就不會有問題。
3、關於第三步
只有VS2015需要這一步
VS2015更改了很多標准庫的鏈接方式和宏定義,而紅寶書第八版中用到的freeglut庫中用到了這些標准庫和宏。所以如果報_sscanf或者__iob_func是無法解析的外部符號之類的錯誤,只需要把平台工具集改成舊的就行了。
4、關於第四步
沒有這一項,LoadShaders中定義的函數會報無法解析的外部符號錯誤。
5、關於第五步
如果不忽略這個默認庫,會報庫沖突或者無法打開庫文件的錯誤。
6、關於第六步
沒著色器畫個卵,運行漆黑一片。
7、雙顯卡電腦又躺槍了
我折騰了半天運行CMD顯示Unable to create OpenGL 4.3 context,尼瑪雙顯卡電腦默認用核心顯卡啟動應用。打開NVidia控制面板-管理3D設置-全局設置-首選圖形處理器,把獨顯設為默認就OK了。
http://www.cnblogs.com/gagugagu/p/5211452.html
⑹ 如何運行opengl紅寶書中的源碼,傻瓜版
如何運行opengl紅寶書中的源碼
一、安裝GLUT工具包
1下載OpenGL需要的庫文件 ,一般可以選擇下載glut庫(內含所有必須文件)
2解壓後將得到的glut.lib和glut32.lib這兩個靜態函數庫復制到文件目錄的lib文件夾下
X:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib
3將glut.dll,glut32.dll這兩個動態庫文件放到操作系統目錄下面的C:\Windows\system32文件夾內(32位系統)或C:\Windows\SysWOW64(64位系統)。
為了兼容性考慮,最好在這兩個目錄下都復制相應的文件。
4將解壓得到的頭文件glut.h復制到目錄如下目錄下:
X:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\GL
提示:如果在incluce目錄下沒有GL文件夾,則需要手動創建
二、VS2013中的配置
創建一個空白的Win32控制台應用程序
在代碼最前面添加包含目錄
#include <GL/glut.h>
然後就可以編輯自己的OpenGL程序了
例如:復制如下代碼到剛配置好的VS中
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
static int year = 0,spin=0, day = 0;
static GLint fogMode;
const int n = 100;
const GLfloat R = 1.0f;
const GLfloat Pi = 3.1415926536f;
void DrawCircle()
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
for (i = 0; i < n; ++i)
{
glColor3f(1.0, 0.0, 0.0);
glVertex2f(R*cos(2 * Pi / n*i), R*sin(2 * Pi / n*i));
}
glEnd();
glFlush();
}
void init(void)
{
GLfloat position[] = { 0.5, 0.5, 3.0, 0.0 };
glEnable(GL_DEPTH_TEST); //防止遮擋
glLightfv(GL_LIGHT0, GL_POSITION, position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
{
GLfloat mat[3] = { 0.1745, 0.01175, 0.01175 };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat);
mat[0] = 0.61424; mat[1] = 0.04136; mat[2] = 0.04136;
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
mat[0] = 0.727811; mat[1] = 0.626959; mat[2] = 0.626959;
glMaterialfv(GL_FRONT, GL_SPECULAR, mat);
glMaterialf(GL_FRONT, GL_SHININESS, 0.6*128.0);
}
glEnable(GL_FOG);
{
GLfloat fogColor[4] = { 0.5, 0.5, 0.5, 1.0 };
fogMode = GL_EXP;
glFogi(GL_FOG_MODE, fogMode);
glFogfv(GL_FOG_COLOR, fogColor);
glFogf(GL_FOG_DENSITY, 0.35);
glHint(GL_FOG_HINT, GL_DONT_CARE);
glFogf(GL_FOG_START, 1.0);
glFogf(GL_FOG_END, 5.0);
}
glClearColor(0.5, 0.9, 0.9, 1.0); /* fog color */
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0, 1.0, 1.0);
glPushMatrix(); //記住自己的位置
glutSolidSphere(1.0, 20, 16); /* 畫太陽半徑、 20經度、16緯度*/
glRotatef(spin, 0.0, 1.0, 0.0); //自轉,繞著一個向量以給定角度旋轉(正的為逆時針)
glTranslatef(2.0, 1.0, 0.0);
glRotatef(spin, 1.0, 0.0, 0.0); //公轉
glRectf(0.1,0.1,0.5,0.5);
glColor3f(0.0, 0.0, 1.0);
glutWireSphere(0.2, 8, 8); /* 畫第一顆小行星 */
glColor3f(1.0, 0.0, 0.0);
glTranslatef(2.0, 1.0, 0.0);
glRotatef(2 * spin, 0.0, 1.0, 0.0);
glutSolidSphere(0.5, 16, 8);
glPopMatrix();//回到原來的位置
glutSwapBuffers();
}
void spinDisplay(void)
{
spin = spin + 2;
if (spin > 360)
spin = spin - 360;
glutPostRedisplay();
}
void mouse(int button,int state,int x,int y )
{
switch (button)
{
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay);
break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 0.5, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 10.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'd':
day = (day + 10) % 360;
glutPostRedisplay();
break;
case 'D':
day = (day - 10) % 360;
glutPostRedisplay();
break;
case 'y':
year = (year + 5) % 360;
glutPostRedisplay();
break;
case 'Y':
year = (year - 5) % 360;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow("OpengGL 程序設計--楊超");
init();
//glutDisplayFunc(DrawCircle);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
//glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
5編譯後能正確運行說明配置成功!
⑺ OpenGL編程大概要學多久誰有好的書推薦
看你心情咯,主要都是一些函數的學習,如果有計算機圖形學基礎,應該不是很難。推薦的話,當然是OpenGL紅寶書,《OpenGL編程指南》咯,網上有很多電子書下,包括書上源碼。
⑻ OPENGL紅寶書英文第八版第一個小程序我敲出來了出錯,誰看看#include "stdafx.h" #include <iostream>
你把庫文件和編譯環境都設置到32位下試一試,不要用64位編譯
⑼ 用c openGL繪制貝塞爾曲面的源代碼
這個問題我以前回答過。。。
紅寶書的例子,稍作改動。。。
UTAH 茶壺的數據。。。好像控制點有點問題,你自己檢查一下吧
⑽ 初學者學習opengl是用紅寶書好還是藍寶書好
藍寶書,藍寶書比較適合初學者,最好是看英文原版的,畢竟翻譯過來的不太好。紅寶書的話,等你有了一定的經驗再來看。