2015年11月29日日曜日
OpenGL:テキスチャーとライト
四角形にテキスチャーをはって、
スポットライトをぐるぐるしてみる。
読み込みファイルは、24ビット ビットマップファイルを読み込み。
今回実行時読み込んだファイル
スポットライトをぐるぐるしてみる。
読み込みファイルは、24ビット ビットマップファイルを読み込み。
今回実行時読み込んだファイル
実行結果
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
#define M_PI 3.141592653589793
#include "GL/glut.h"
BITMAPFILEHEADER bmpFH;
BITMAPINFOHEADER bmpIH;
static GLubyte *imageBuf;
static GLuint texName;
//24色 bmpファイルの読み込み
void readFile(PSTR fName){
HANDLE hFile;
DWORD readBytes;
/* ファイルのオープン*/
hFile = CreateFile(fName , GENERIC_READ , 0 , NULL ,
OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
/* ヘッダ部分の読み込み */
ReadFile(hFile,&bmpFH,sizeof(BITMAPFILEHEADER),&readBytes,NULL);
ReadFile(hFile , &bmpIH , sizeof (BITMAPINFOHEADER) , &readBytes , NULL);
/*サイズ分のバッファ確保 */
imageBuf = (GLubyte*)malloc(bmpIH.biSizeImage*sizeof(GLubyte));
/*ファイル読み込み*/
ReadFile(hFile , imageBuf,bmpIH.biSizeImage*sizeof(GLubyte),&readBytes,NULL);
/*ファイルを閉じる*/
CloseHandle(hFile);
}
void display(void)
{
GLdouble len = 1000;
GLdouble len2 = 0.9;
GLdouble xPos,yPos,xCPos,yCPos;
int ii,jj;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(1,1,1);
glBegin(GL_LINES);
glVertex3d(-len,0,0);
glVertex3d(len,0,0);
glVertex3d(0,-len,0);
glVertex3d(0,len,0);
glVertex3d(0,0,-len);
glVertex3d(0,0,len);
glEnd();
GLdouble nv[] = {0,0,1};
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBindTexture(GL_TEXTURE_2D,texName);
glBegin(GL_QUADS);
double num = 450;
for(ii = 0;ii<=num;ii++){
for(jj = 0;jj<=num;jj++){
xPos = jj/num;
yPos = ii/num;
xCPos = jj/num;
yCPos = ii/num;
glNormal3dv(nv);
glTexCoord2d(xPos,yPos);glVertex3d(xPos,yPos,0);
glNormal3dv(nv);
glTexCoord2d(xPos+0.01,yPos);glVertex3d(xPos+0.01,yPos,0);
glNormal3dv(nv);
glTexCoord2d(xPos+0.01,yPos+0.01);glVertex3d(xPos+0.01,yPos+0.01,0);
glNormal3dv(nv);
glTexCoord2d(xPos,yPos+0.01);glVertex3d(xPos,yPos+0.01,0);
}
}
glDisable(GL_TEXTURE_2D);
glEnd();
glFlush();
glutSwapBuffers();
}
void myReshape(GLsizei w, GLsizei h){
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1, 0, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void idleFunc(void){
static GLdouble x = 0;
static GLdouble y = 0;
static GLint theta = 0;
static GLfloat spot_direction[] = { 0.0, 0.05, -1.0 } ;
static GLdouble agree;
theta +=5;
if(theta >= 360){
theta = 0;
}
// スポットライトの方向指定
agree = M_PI/180*theta;
x = cos(agree)/4+0.25;
y = sin(agree)/4+0.25;
spot_direction[0] = x;
spot_direction[1] = y;
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
glutPostRedisplay();
Sleep(1);
glutIdleFunc(idleFunc);
}
void myinit (char* argv)
{
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 0.0 };
GLfloat light_position[] = {0.0, 0.0, 1.5, 1.0 };
GLfloat spot_direction[] = { 0.0, 0.05, -1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat lightBlack[] = {0.0,0.0,0.0,0.0};
// ライトの設定
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightBlack);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightBlack);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 5.0);
glClearColor (0.0, 0.0, 0.0, 0.0);
readFile(argv);
//Textureの設定
glGenTextures(1,&texName);
glBindTexture(GL_TEXTURE_2D,texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,3,bmpIH.biWidth,bmpIH.biHeight,0
,GL_BGR_EXT,GL_UNSIGNED_BYTE,imageBuf);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow(argv[0]);
glutPositionWindow(100,100);
glutReshapeFunc (myReshape);
glutDisplayFunc(display);
myinit (argv[1]);
glutIdleFunc(idleFunc);
glutMainLoop();
}
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
#define M_PI 3.141592653589793
#include "GL/glut.h"
BITMAPFILEHEADER bmpFH;
BITMAPINFOHEADER bmpIH;
static GLubyte *imageBuf;
static GLuint texName;
//24色 bmpファイルの読み込み
void readFile(PSTR fName){
HANDLE hFile;
DWORD readBytes;
/* ファイルのオープン*/
hFile = CreateFile(fName , GENERIC_READ , 0 , NULL ,
OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
/* ヘッダ部分の読み込み */
ReadFile(hFile,&bmpFH,sizeof(BITMAPFILEHEADER),&readBytes,NULL);
ReadFile(hFile , &bmpIH , sizeof (BITMAPINFOHEADER) , &readBytes , NULL);
/*サイズ分のバッファ確保 */
imageBuf = (GLubyte*)malloc(bmpIH.biSizeImage*sizeof(GLubyte));
/*ファイル読み込み*/
ReadFile(hFile , imageBuf,bmpIH.biSizeImage*sizeof(GLubyte),&readBytes,NULL);
/*ファイルを閉じる*/
CloseHandle(hFile);
}
void display(void)
{
GLdouble len = 1000;
GLdouble len2 = 0.9;
GLdouble xPos,yPos,xCPos,yCPos;
int ii,jj;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(1,1,1);
glBegin(GL_LINES);
glVertex3d(-len,0,0);
glVertex3d(len,0,0);
glVertex3d(0,-len,0);
glVertex3d(0,len,0);
glVertex3d(0,0,-len);
glVertex3d(0,0,len);
glEnd();
GLdouble nv[] = {0,0,1};
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBindTexture(GL_TEXTURE_2D,texName);
glBegin(GL_QUADS);
double num = 450;
for(ii = 0;ii<=num;ii++){
for(jj = 0;jj<=num;jj++){
xPos = jj/num;
yPos = ii/num;
xCPos = jj/num;
yCPos = ii/num;
glNormal3dv(nv);
glTexCoord2d(xPos,yPos);glVertex3d(xPos,yPos,0);
glNormal3dv(nv);
glTexCoord2d(xPos+0.01,yPos);glVertex3d(xPos+0.01,yPos,0);
glNormal3dv(nv);
glTexCoord2d(xPos+0.01,yPos+0.01);glVertex3d(xPos+0.01,yPos+0.01,0);
glNormal3dv(nv);
glTexCoord2d(xPos,yPos+0.01);glVertex3d(xPos,yPos+0.01,0);
}
}
glDisable(GL_TEXTURE_2D);
glEnd();
glFlush();
glutSwapBuffers();
}
void myReshape(GLsizei w, GLsizei h){
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1, 0, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void idleFunc(void){
static GLdouble x = 0;
static GLdouble y = 0;
static GLint theta = 0;
static GLfloat spot_direction[] = { 0.0, 0.05, -1.0 } ;
static GLdouble agree;
theta +=5;
if(theta >= 360){
theta = 0;
}
// スポットライトの方向指定
agree = M_PI/180*theta;
x = cos(agree)/4+0.25;
y = sin(agree)/4+0.25;
spot_direction[0] = x;
spot_direction[1] = y;
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
glutPostRedisplay();
Sleep(1);
glutIdleFunc(idleFunc);
}
void myinit (char* argv)
{
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 0.0 };
GLfloat light_position[] = {0.0, 0.0, 1.5, 1.0 };
GLfloat spot_direction[] = { 0.0, 0.05, -1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat lightBlack[] = {0.0,0.0,0.0,0.0};
// ライトの設定
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightBlack);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightBlack);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 5.0);
glClearColor (0.0, 0.0, 0.0, 0.0);
readFile(argv);
//Textureの設定
glGenTextures(1,&texName);
glBindTexture(GL_TEXTURE_2D,texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,3,bmpIH.biWidth,bmpIH.biHeight,0
,GL_BGR_EXT,GL_UNSIGNED_BYTE,imageBuf);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow(argv[0]);
glutPositionWindow(100,100);
glutReshapeFunc (myReshape);
glutDisplayFunc(display);
myinit (argv[1]);
glutIdleFunc(idleFunc);
glutMainLoop();
}
2015年11月26日木曜日
.netで表の描画
.netで表描画。
実行結果はこんな感じ
ついでに印刷ボタンも追加
コンパイルは
csc ChartTest.cs /r:System.Windows.Forms.DataVisualization.dll
ソースはこんな感じ
ついでに印刷ボタンも追加
コンパイルは
csc ChartTest.cs /r:System.Windows.Forms.DataVisualization.dll
ソースはこんな感じ
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
public class ChartTest:Form
{
private Chart chart;
private PrintDocument pd;
public ChartTest()
{
this.SuspendLayout();
Button btn = new Button();
btn.Text = "印刷";
btn.Location = new Point(10,420);
btn.Click += new EventHandler(OKBtn_Click);
Button btn2 = new Button();
btn2.Text = "チャートタイプ変更";
btn2.Location = new Point(150,420);
btn2.Size = new Size(200,btn2.Size.Height);
btn2.Click += new EventHandler(OKBtn2_Click);
Size = new Size(500,500);
SetChart();
Controls.Add(btn);
Controls.Add(btn2);
this.ResumeLayout();
}
//印刷ボタン押下時の処理
void OKBtn_Click (Object sender,
EventArgs e){
pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
pd.Print();
}
//変更ボタン押下時の処理
void OKBtn2_Click (Object sender,
EventArgs e){
chart.Series[0].ChartType = SeriesChartType.Bar;
}
//印刷ページ設定
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
Size s = chart.Size;
Bitmap bmp = new Bitmap(s.Width,s.Height);
Graphics g = ev.Graphics;
chart.DrawToBitmap(bmp,new Rectangle(0,0,s.Width,s.Height));
g.DrawImage(bmp,0,0);
}
//チャート画面の作成
private void SetChart()
{
//チャート画面の作成
chart = new Chart();
chart.ChartAreas.Add(new ChartArea("chart1"));
chart.Size = new Size(400,400);
Controls.Add(chart);
//グラフの画面
Series series;
chart.Series.Add(new Series());
series = chart.Series[0];
series.ChartArea = "chart1";
series.ChartType = SeriesChartType.Line;
//データの作成
int ii;
for(ii = 1; ii < 10 ; ii++)
{
DataPoint dp = new DataPoint(ii,ii*2);
series.Points.Add(dp);
}
}
public static int Main(string[] args)
{
ChartTest ct = new ChartTest();
ct.ShowDialog();
return 0;
}
}
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
public class ChartTest:Form
{
private Chart chart;
private PrintDocument pd;
public ChartTest()
{
this.SuspendLayout();
Button btn = new Button();
btn.Text = "印刷";
btn.Location = new Point(10,420);
btn.Click += new EventHandler(OKBtn_Click);
Button btn2 = new Button();
btn2.Text = "チャートタイプ変更";
btn2.Location = new Point(150,420);
btn2.Size = new Size(200,btn2.Size.Height);
btn2.Click += new EventHandler(OKBtn2_Click);
Size = new Size(500,500);
SetChart();
Controls.Add(btn);
Controls.Add(btn2);
this.ResumeLayout();
}
//印刷ボタン押下時の処理
void OKBtn_Click (Object sender,
EventArgs e){
pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
pd.Print();
}
//変更ボタン押下時の処理
void OKBtn2_Click (Object sender,
EventArgs e){
chart.Series[0].ChartType = SeriesChartType.Bar;
}
//印刷ページ設定
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
Size s = chart.Size;
Bitmap bmp = new Bitmap(s.Width,s.Height);
Graphics g = ev.Graphics;
chart.DrawToBitmap(bmp,new Rectangle(0,0,s.Width,s.Height));
g.DrawImage(bmp,0,0);
}
//チャート画面の作成
private void SetChart()
{
//チャート画面の作成
chart = new Chart();
chart.ChartAreas.Add(new ChartArea("chart1"));
chart.Size = new Size(400,400);
Controls.Add(chart);
//グラフの画面
Series series;
chart.Series.Add(new Series());
series = chart.Series[0];
series.ChartArea = "chart1";
series.ChartType = SeriesChartType.Line;
//データの作成
int ii;
for(ii = 1; ii < 10 ; ii++)
{
DataPoint dp = new DataPoint(ii,ii*2);
series.Points.Add(dp);
}
}
public static int Main(string[] args)
{
ChartTest ct = new ChartTest();
ct.ShowDialog();
return 0;
}
}
2015年11月25日水曜日
よく使う emacs キーバインドメモ
基本
キーバインド | 説明 |
C-x C-c | emacsの終了 |
C-x C-f | ファイルを開く |
C-x b | バッファを開く |
C-g | 現在の操作を終了 |
C-spc | マークの設定 |
カーソル移動
C-p | 前の行 |
C-n | 次の行 |
C-f | 次の文字 |
C-b | 前の文字 |
M-> | ファイルの最終行に移動 |
M-< | ファイルの最初の行に移動 |
C-x C-x | マーク位置に戻る |
C-v | 次のページに移動 |
M-v | 前のページに移動 |
M-% | 文字の置換 |
C-s | 文字列検索(前方向) |
C-r | 文字列検索(後ろ方向) |
編集
C-k | 行の削除 |
C-x Ret c 文字コード入力 C-x C-f | 文字コードを指定してファイルを開く |
C-x Ret f 文字コード入力 | 開いているファイルの文字コードを変更する |
C-w | マーク位置からカーソル位置を削除 |
M-w | マーク位置からカーソル位置をコピー |
C-y | コピーした文字を貼り付け |
C-x rk | 矩形領域の削除 |
C-x rt | 矩形領域に指定文字挿入 |
C-x rr | 矩形領域のコピー |
C-x rg | 矩形領域に貼り付け |
C-x C-u | 選択範囲を大文字にする |
C-x C-l | 選択範囲を小文字にする |
その他
C-x 52 | ウィンドウを開く |
C-x 2 | ウィンドウを上下に分割する |
C-x 3 | ウィンドウを縦横に分割する |
C-x 1 | 分割したウィンドウを元に戻す |
2015年11月19日木曜日
Windowsプログラム勉強用メモ
Windowsプログラミング
標準Windows API
細かくひとつづつ説明してくれている。
わかりやすい
猫でもわかる
有名なサイト、ボリュームが多い
その他参考サイト
リソーススクリプト定義
リソーススクリプトの書き方定義。英語だけど
Bcc32のダウンロードページ
フリーのコンパイラ
Window Message
Window Messageの参考資料(英語)
2015年11月15日日曜日
OpenGL:三角形を回転してみる
三角形を表示できたので、次は三角形を回転してみる。
実行結果は、こんな感じ。
実行結果は、こんな感じ。
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "GL/glut.h"
GLfloat angle = 0;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1,1,1);
//線を描画
glBegin(GL_LINES);
glVertex3d(-1,0,0);
glVertex3d(1,0,0);
glVertex3d(0,-1,0);
glVertex3d(0,1,0);
glEnd();
//三角形を描画
//線が回らないようにPushMatrix
glPushMatrix();
glRotated(angle,0,1,0);
glBegin(GL_TRIANGLES);
glColor3d(1,0,0);
glVertex3d(-0.5,0,0);
glColor3d(0,1,0);
glVertex3d(0.5,0,0);
glColor3d(0,0,1);
glVertex3d(0.0,0.5,0);
glEnd();
glPopMatrix();
glFlush();
glutSwapBuffers();
}
void animate(void){
if(angle >= 360){
angle = 0;
}
else{
angle += 2;
}
Sleep(10);
glutPostRedisplay();
glutIdleFunc(animate);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow("TRIANGLE TEST");
glutPositionWindow(100,100);
glutIdleFunc(animate);
glutDisplayFunc(display);
glutMainLoop();
}
#include <GL/gl.h>
#include <GL/glu.h>
#include "GL/glut.h"
GLfloat angle = 0;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1,1,1);
//線を描画
glBegin(GL_LINES);
glVertex3d(-1,0,0);
glVertex3d(1,0,0);
glVertex3d(0,-1,0);
glVertex3d(0,1,0);
glEnd();
//三角形を描画
//線が回らないようにPushMatrix
glPushMatrix();
glRotated(angle,0,1,0);
glBegin(GL_TRIANGLES);
glColor3d(1,0,0);
glVertex3d(-0.5,0,0);
glColor3d(0,1,0);
glVertex3d(0.5,0,0);
glColor3d(0,0,1);
glVertex3d(0.0,0.5,0);
glEnd();
glPopMatrix();
glFlush();
glutSwapBuffers();
}
void animate(void){
if(angle >= 360){
angle = 0;
}
else{
angle += 2;
}
Sleep(10);
glutPostRedisplay();
glutIdleFunc(animate);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow("TRIANGLE TEST");
glutPositionWindow(100,100);
glutIdleFunc(animate);
glutDisplayFunc(display);
glutMainLoop();
}
2015年11月14日土曜日
OpenGL:最初は三角形
取りあえず、GLUTを使って、三角形を表示するプログラム
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1,1,1);
glBegin(GL_TRIANGLES);
glVertex3d(0,0,0);
glVertex3d(0.9,0,0);
glVertex3d(0.9,0.9,0);
glEnd();
glFlush();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow("TRIANGLE TEST");
glutPositionWindow(100,100);
glutDisplayFunc(display);
glutMainLoop();
}
コンパイルした結果はこんな感じ。{
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1,1,1);
glBegin(GL_TRIANGLES);
glVertex3d(0,0,0);
glVertex3d(0.9,0,0);
glVertex3d(0.9,0.9,0);
glEnd();
glFlush();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
glutCreateWindow("TRIANGLE TEST");
glutPositionWindow(100,100);
glutDisplayFunc(display);
glutMainLoop();
}
2015年11月10日火曜日
OpenGL:勉強用リンク
OpenGL Redbook
3つの中では、一番丁寧で詳しいと思うけど、
英語&むずかしい
GLUTによる「手抜き」OpenGL入門
大学の先生の分かりやすいけど、ボリューム不足
OpenGL入門
プログラム例が多い
OpenGL 2.1 API
OpenGL 4.5 API
GLUT API Version3
OpenGL TextureFAQ
3つの中では、一番丁寧で詳しいと思うけど、
英語&むずかしい
GLUTによる「手抜き」OpenGL入門
大学の先生の分かりやすいけど、ボリューム不足
OpenGL入門
プログラム例が多い
OpenGL 2.1 API
OpenGL 4.5 API
GLUT API Version3
OpenGL TextureFAQ
2015年11月9日月曜日
登録:
投稿 (Atom)