SlideShare a Scribd company logo
OpenGLプログラミン
グ
Cocoa勉強会 関東 Swift勉強会 2018-01
2018/1/19 Bitz Co., Ltd. 村上幸雄
• 埼玉県朝霞市でソフトハウスを起業。
• macOSやiOS、Androidのアプリケーション開発を主に請け負う。
• 自社アプリの製作。
• Twitter: @m_yukio
• Facebook: yukio.murakami
• GitHub: murakami
• http://www.bitz.co.jp/weblog/
BUKURO.swift
• macOS/iOS/watchOS/tvOSプログラマーのための勉強会。
初心者大歓迎。
• Cocoa勉強会 関東とMOSAの合同勉強会。
ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST
で開催。
• 申し込みは、connpassから。
https://cocoa-kanto.connpass.com/
• プログラマーが楽しくプログラミングできるように
• 勉強会に参加された方全員が学び得る場を提供!
• 勉強会に参加できない方も学び得るよう、勉強会の成果を
アウトプットする!
• プログラマーの拠り所となる!
GLUTでサンプルを事
項したらエラーとなる
https://github.com/murakami/workbook/tree/master/mac/IRIS
void display(void)
{
/* カラーバッファの初期化 */
glClear(GL_COLOR_BUFFER_BIT);
/* モデリング変換、z軸の負の方向に幾何形状を4単位移動する。 */
glLoadIdentity(); /* 単位行列 */
glTranslatef(0.0f, 0.0f, -4.0f);
/* 幾何形状を描画する。 */
glCallList(gListID);
/* バッファの入れ替え */
glutSwapBuffers();
assert(glGetError() == GL_NO_ERROR);
}
void resize(int w, int h)
{
/* ウィンドウ・サイズとOpenGLの座標を対応づける */
glViewport(0, 0, w, h);
/* 投影行列とアスペクト比を更新する */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(50.0, (GLdouble)w / (GLdouble)h, 1.0, 10.0);
/* 表示ルーチン用にモデルビューモードに設定する */
glMatrixMode(GL_MODELVIEW);
assert(glGetError() == GL_NO_ERROR);
gWidth = w;
gHeight = h;
}
void init(void)
{
/* ディザ処理を無効にする */
glDisable(GL_DITHER);
std::string ver((const char*)glGetString(GL_VERSION));
assert(! ver.empty());
std::istringstream verStream(ver);
int major, minor;
char dummySep;
verStream >> major >> dummySep >> minor;
const bool useVertexArrays = ((major >= 1) && (minor >= 1));
/* 三角形の頂点を定義する */
const GLfloat data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f
};
if (useVertexArrays) {
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLAT, 0, data);
}
/* ディスプレイリストを作成する。 */
gListID = glGenLists(1);
glNewList(gListID, GL_COMPILE);
assert(glGetError() == GL_NO_ERROR);
if (useVertexArrays) {
glDrawArrays(GL_TRIANGLES, 0, 3);
}
else {
glBegin(GL_TRIANGLES);
glVertex3fv(&data[0]);
glVertex3fv(&data[3]);
glVertex3fv(&data[6]);
glEnd();
}
glEndList();
/* 描画 */
glutDisplayFunc(display);
/* リサイズ処理 */
glutReshapeFunc(resize);
}
エラー
int main(int argc, const char * argv[])
{
@autoreleasepool {
glutInit(&argc, (char **)argv);
/* RGBカラーモード ダブルバッファ */
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
/* 初期ウィンドウ・サイズ */
glutInitWindowSize(gWidth, gHeight);
/* 初期ウィンドウ位置 */
glutInitWindowPosition(500, 100);
/* タイトルバー */
glutCreateWindow("IRIS GL");
/* 初期化 */
init();
/* 主ループ(イベント駆動) */
glutMainLoop();
}
return 0;
}
シェーダを使い方法で
再挑戦
雛形CocoaAppを選択
フレームワークを追加
//
// MyGLView.m
// Crimson
//
// Created by 村上幸雄 on 2018/01/03.
// Copyright © 2018年 Bitz Co., Ltd. All rights reserved.
//
@import GLKit;
@import OpenGL;
#import <OpenGL/OpenGL.h>
#import <OpenGL/gl3.h>
#import <OpenGL/glu.h>
#import "MyGLView.h"
NSOpenGLViewを継承したカ
スタムビューを組み込む
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
/* 細かな背邸を行うため、コードで生成。 */
let viewFrame = self.view.frame
let glView = MyGLView(frame: viewFrame)
/* ウィンドウの大きさに追従して合わせる */
glView.translatesAutoresizingMaskIntoConstraints = true
glView.autoresizingMask = NSView.AutoresizingMask(rawValue:
NSView.AutoresizingMask.RawValue(
UInt8(NSView.AutoresizingMask.width.rawValue)
| UInt8(NSView.AutoresizingMask.height.rawValue)))
self.view.addSubview(glView)
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
カスタムビュー
#import <Cocoa/Cocoa.h>
@interface MyGLView : NSOpenGLView
@end
• わざわざSwiftは意味ないでしょう。
• 分かりやすい構成にするため、便利コードは控えます。
内部変数など
@interface MyGLView ()
@property (nonatomic, assign) GLuint program;
@property (nonatomic, assign) GLuint vertexShader;
@property (nonatomic, assign) GLuint fragmentShader;
@property (nonatomic, assign) GLuint vbo; /* vertex buffer object */
@property (nonatomic, assign) GLuint vao; /* vertex array object */
- (GLchar *)readResource:(NSString *)name ofType:(NSString *)ext;
@end
初期化
- (instancetype)initWithFrame:(NSRect)frame
{
NSOpenGLPixelFormatAttribute attrs[] = {
NSOpenGLPFAAllowOfflineRenderers,
/* If present, this attribute indicates that offline renderers may be used. */
NSOpenGLPFAAccelerated, /* require hardware-accelerated pixelformat */
NSOpenGLPFADoubleBuffer, /* require double-buffered pixelformat */
NSOpenGLPFAColorSize, 32, /* require 32 bits for color-channels */
NSOpenGLPFADepthSize, 32, /* require a 32-bit depth buffer */
NSOpenGLPFAMultisample,
NSOpenGLPFASampleBuffers, 1,
/* Value is a nonnegative number indicating the number of multisample buffers. */
NSOpenGLPFASamples, 4,
/* Value is a nonnegative indicating the number of samples per multisample buffer. */
NSOpenGLPFANoRecovery,
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, /* OpenGO最新版を指定 */
/* The requested profile must implement the OpenGL 3.2 core functionality. */
0
};
NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
self = [super initWithFrame:frame pixelFormat:pixelFormat];
if (self) {
[self setWantsBestResolutionOpenGLSurface:YES]; /* Retina Display対応 */
}
return self;
}
Storyboardだとインスペクラでの設定になっ
てしまうのをコードで設定。
シェーダを取り込む
- (void)prepareOpenGL
{
[super prepareOpenGL];
NSOpenGLContext *glContext = [self openGLContext];
self.vertexShader = glCreateShader(GL_VERTEX_SHADER); /* 頂点シェーダ・ハンドル */
const GLchar *vertexSource = [self readResource:@"MyShader" ofType:@"vsh"]; /* シェーダのソースコードの読み込み */
glShaderSource(self.vertexShader, 1, &vertexSource, NULL); /* シェーダのソースコードを設定 */
glCompileShader(self.vertexShader); /* コンパイル */
free((void *)vertexSource);
self.fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); /* フラグメント・シェーダ・ハンドル */
const GLchar *fragmentSource = [self readResource:@"MyShader" ofType:@"fsh"]; /* シェーダのソースコードの読み込み */
glShaderSource(self.fragmentShader, 1, &fragmentSource, NULL); /* シェーダのソースコードを設定 */
glCompileShader(self.fragmentShader); /* コンパイル */
free((void *)fragmentSource);
self.program = glCreateProgram(); /* プログラム・ハンドル */
glAttachShader(self.program, self.vertexShader); /* プログラムに頂点シェーダを割り当てる */
glAttachShader(self.program, self.fragmentShader); /* プログラムにフラグメント・シェーダを割り当てる */
glLinkProgram(self.program); /* リンク */
vertex buffer object
glGenBuffers(1, &_vbo); /* VBOを作成 */
glBindBuffer(GL_ARRAY_BUFFER, self.vbo); /* 頂点シェーダに渡すデータ配列 */
GLfloat data[] = {
-0.8f, -0.8f, 0.0f, /* 頂点の座標 */
1.0f, 0.0f, 0.0f, 1.0f, /* 頂点の色情報 */
0.8f, -0.8f, 0.0f, /* 頂点の座標 */
0.0f, 1.0f, 0.0f, 1.0f, /* 頂点の色情報 */
0.0f, 0.8f, 0.0f, /* 頂点の座標 */
0.0f, 0.0f, 1.0f, 1.0f, /* 頂点の色情報 */
};
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 7 * 3, data, GL_STATIC_DRAW);
/* GPUに転送 */
vertex array object
glGenVertexArrays(1, &_vao); /* VAOを作成 */
glBindVertexArray(self.vao); /* OpenGLコンテキストに結びつける */
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
sizeof(GLfloat) * 7, (GLfloat *)0);
/* インデックス0: 頂点の色情報 */
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE,
sizeof(GLfloat) * 7, ((GLfloat *)0) + 3);
/* インデックス1: 頂点の色情報 */
glClearColor(0.2f, 0.4f, 0.6f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
[glContext flushBuffer];
}
描画
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
glUseProgram(self.program); /* レンダリングで使用するシェーダを設定 */
glClearColor(0.2f, 0.4f, 0.6f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(self.vao); /* VAOを結びつける */
glEnableVertexAttribArray(0); /* 頂点属性を指定 */
glEnableVertexAttribArray(1); /* 頂点属性を指定 */
glDrawArrays(GL_TRIANGLES, 0, 3); /* レンダリング */
[[self openGLContext] flushBuffer];
}
ビューポートを設定
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
/* ビューポートのサイズ */
NSSize size = dirtyRect.size;
size = [self convertSizeToBacking:size]; /* Retina対応 */
glViewport(0, 0, size.width, size.height); /* ビューポートの指定 */
頂点シェーダ
#version 410
layout (location=0) in vec3 vertex_pos; /* 0番目の入力: 頂点の座標 */
layout (location=1) in vec4 vertex_color; /* 1番目の入力: 頂点の色情報 */
out vec4 color; /* フラグメント・シェーダに渡す色情報 */
void main()
{
gl_Position = vec4(vertex_pos, 1.0);
/* 受け取った座標をそのままの位置に表示する */
color = vertex_color;
}
/* End Of File */
フラグメント・シェー
ダ
#version 410
in vec4 color; /* 頂点シェーダから渡された色情報 */
layout (location=0) out vec4 frag_color; /* ピクセルの色 */
void main()
{
frag_color = color; /* 渡された色情報をそのまま出力 */
}
/* End Of File */
固定パイプライン
ローカル座標系
モデル変換
ワールド座標系
ビュー変換
視点座標系
投影変換
クリッピング座標系
クリッピング
ビューポート変換
走査変換
画素の陰影付け
隠面消去処理
画像
シェーダ
バッファオブジェクト
頂点シェーダ
ジオメトリックシェーダ
クリッピング
スクリーンマッピング
ラスタライザ
フラグメントシェーダ
ラスタオペレーション
フレームバッファ
映像出力

More Related Content

What's hot

Griffon10 in groovy_fx
Griffon10 in groovy_fxGriffon10 in groovy_fx
Griffon10 in groovy_fx
kimukou_26 Kimukou
 
LightNode - Micro RPC/REST Framework
LightNode - Micro RPC/REST FrameworkLightNode - Micro RPC/REST Framework
LightNode - Micro RPC/REST Framework
Yoshifumi Kawai
 
Vagrant+virtualboxを使ってみよう
Vagrant+virtualboxを使ってみようVagrant+virtualboxを使ってみよう
Vagrant+virtualboxを使ってみよう
Kei IWASAKI
 
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
大規模Node.jsを支える ロードバランスとオートスケールの独自実装大規模Node.jsを支える ロードバランスとオートスケールの独自実装
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
kidach1
 
Vagrant - 最近流行ってるらしいけど何者?
Vagrant - 最近流行ってるらしいけど何者?Vagrant - 最近流行ってるらしいけど何者?
Vagrant - 最近流行ってるらしいけど何者?
Yoshinori Nakanishi
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Yukari Sakurai
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggugkimukou_26 Kimukou
 
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
Yuta Matsumura
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -
Hayato Mizuno
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1Atsushi Tadokoro
 
Gws 20141024 gradle_intro
Gws 20141024 gradle_introGws 20141024 gradle_intro
Gws 20141024 gradle_intro
Nobuhiro Sue
 
The History of LINQ
The History of LINQThe History of LINQ
The History of LINQ
Yoshifumi Kawai
 
Gradle handson
Gradle handsonGradle handson
Gradle handson
Nemoto Yusuke
 
ClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろうClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろう
Kazuhiro Hara
 
coma - creator’s talk session: Code - openFrameworks
coma - creator’s talk session: Code - openFrameworkscoma - creator’s talk session: Code - openFrameworks
coma - creator’s talk session: Code - openFrameworksAtsushi Tadokoro
 
React入門-JSONを取得して表示する
React入門-JSONを取得して表示するReact入門-JSONを取得して表示する
React入門-JSONを取得して表示する
regret raym
 
Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系
祐司 伊藤
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
Akihiko Horiuchi
 

What's hot (20)

Griffon10 in groovy_fx
Griffon10 in groovy_fxGriffon10 in groovy_fx
Griffon10 in groovy_fx
 
LightNode - Micro RPC/REST Framework
LightNode - Micro RPC/REST FrameworkLightNode - Micro RPC/REST Framework
LightNode - Micro RPC/REST Framework
 
Vagrant+virtualboxを使ってみよう
Vagrant+virtualboxを使ってみようVagrant+virtualboxを使ってみよう
Vagrant+virtualboxを使ってみよう
 
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
大規模Node.jsを支える ロードバランスとオートスケールの独自実装大規模Node.jsを支える ロードバランスとオートスケールの独自実装
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
 
Vagrant - 最近流行ってるらしいけど何者?
Vagrant - 最近流行ってるらしいけど何者?Vagrant - 最近流行ってるらしいけど何者?
Vagrant - 最近流行ってるらしいけど何者?
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
 
griffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jgguggriffon plugin を 実際に作ってみよう #jggug
griffon plugin を 実際に作ってみよう #jggug
 
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
 
Gws 20141024 gradle_intro
Gws 20141024 gradle_introGws 20141024 gradle_intro
Gws 20141024 gradle_intro
 
The History of LINQ
The History of LINQThe History of LINQ
The History of LINQ
 
Gradle handson
Gradle handsonGradle handson
Gradle handson
 
scala-kaigi1-sbt
scala-kaigi1-sbtscala-kaigi1-sbt
scala-kaigi1-sbt
 
ClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろうClojureでElectronアプリを作ろう
ClojureでElectronアプリを作ろう
 
coma - creator’s talk session: Code - openFrameworks
coma - creator’s talk session: Code - openFrameworkscoma - creator’s talk session: Code - openFrameworks
coma - creator’s talk session: Code - openFrameworks
 
React入門-JSONを取得して表示する
React入門-JSONを取得して表示するReact入門-JSONを取得して表示する
React入門-JSONを取得して表示する
 
Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系Webブラウザで使えるいろんな処理系
Webブラウザで使えるいろんな処理系
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
 

Similar to OpenGLプログラミング

[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
Tomoki Oyamatsu
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
5mingame2
 
WebGL and Three.js
WebGL and Three.jsWebGL and Three.js
WebGL and Three.js
yomotsu
 
Driverについて
DriverについてDriverについて
Driverについて
幸雄 村上
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
Kazuhiro Hara
 
ゆるふわAzure Functions
ゆるふわAzure FunctionsゆるふわAzure Functions
ゆるふわAzure Functions
Keiji Kamebuchi
 
Server side Swift & Photo Booth
Server side Swift & Photo Booth Server side Swift & Photo Booth
Server side Swift & Photo Booth
LINE Corporation
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
Yuta Matsumura
 
Xcode and iTC submission topics
Xcode and iTC submission topicsXcode and iTC submission topics
Xcode and iTC submission topics
Syo Ikeda
 
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
Issei Hiraoka
 
Wolcome to swift
Wolcome to swiftWolcome to swift
Wolcome to swift
Kyohei Ito
 
20130315 abc firefox_os
20130315 abc firefox_os20130315 abc firefox_os
20130315 abc firefox_os
Tomoaki Konno
 
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるNetラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるdavid9142
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力
Keiji Ariyama
 
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideLabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training Slide
Yusuke Tochigi
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiNaruto TAKAHASHI
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
Hiroshi SHIBATA
 
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMSDrupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Tomoki Hasegawa
 

Similar to OpenGLプログラミング (20)

[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
 
WebGL and Three.js
WebGL and Three.jsWebGL and Three.js
WebGL and Three.js
 
Driverについて
DriverについてDriverについて
Driverについて
 
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC WebアプリケーションPlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
PlayFramework 2.0 Javaと WebSocketでつくる リアルタイムMVC Webアプリケーション
 
ゆるふわAzure Functions
ゆるふわAzure FunctionsゆるふわAzure Functions
ゆるふわAzure Functions
 
Server side Swift & Photo Booth
Server side Swift & Photo Booth Server side Swift & Photo Booth
Server side Swift & Photo Booth
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 
Xcode and iTC submission topics
Xcode and iTC submission topicsXcode and iTC submission topics
Xcode and iTC submission topics
 
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
2020/06/16 tsjp-azure-staticwebapps-vs_codespaces
 
Wolcome to swift
Wolcome to swiftWolcome to swift
Wolcome to swift
 
20130315 abc firefox_os
20130315 abc firefox_os20130315 abc firefox_os
20130315 abc firefox_os
 
Open modeler
Open modelerOpen modeler
Open modeler
 
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考えるNetラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
Netラボ2012年6月勉強会 マイクロソフトのオープンソース戦略を考える
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力
 
LabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training SlideLabVIEW NXG Web Module Training Slide
LabVIEW NXG Web Module Training Slide
 
Tizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native apiTizen 2.0 alpha でサポートされなかった native api
Tizen 2.0 alpha でサポートされなかった native api
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMSDrupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
 

More from 幸雄 村上

アプリケーション識別子.pdf
アプリケーション識別子.pdfアプリケーション識別子.pdf
アプリケーション識別子.pdf
幸雄 村上
 
圧縮ネイティブ・ライブラリについて.pdf
圧縮ネイティブ・ライブラリについて.pdf圧縮ネイティブ・ライブラリについて.pdf
圧縮ネイティブ・ライブラリについて.pdf
幸雄 村上
 
分散環境におけるジャストインタイム設定の試み
分散環境におけるジャストインタイム設定の試み分散環境におけるジャストインタイム設定の試み
分散環境におけるジャストインタイム設定の試み
幸雄 村上
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
幸雄 村上
 
え!それって参照渡し?
え!それって参照渡し?え!それって参照渡し?
え!それって参照渡し?
幸雄 村上
 
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
幸雄 村上
 
AppleScriptなど
AppleScriptなどAppleScriptなど
AppleScriptなど
幸雄 村上
 
MojaveのDark Mode
MojaveのDark ModeMojaveのDark Mode
MojaveのDark Mode
幸雄 村上
 
AppleScriptとは何ぞや
AppleScriptとは何ぞやAppleScriptとは何ぞや
AppleScriptとは何ぞや
幸雄 村上
 
Web API 通信の符号化について
Web API 通信の符号化についてWeb API 通信の符号化について
Web API 通信の符号化について
幸雄 村上
 
Master-Detail App を実装する
Master-Detail App を実装するMaster-Detail App を実装する
Master-Detail App を実装する
幸雄 村上
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
幸雄 村上
 
Getting a packet trace
Getting a packet traceGetting a packet trace
Getting a packet trace
幸雄 村上
 
The Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKitThe Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKit
幸雄 村上
 
Swiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装するSwiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装する
幸雄 村上
 
ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦
幸雄 村上
 
IBM Watson Services for Core ML
IBM Watson Services for Core MLIBM Watson Services for Core ML
IBM Watson Services for Core ML
幸雄 村上
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
幸雄 村上
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
幸雄 村上
 

More from 幸雄 村上 (20)

アプリケーション識別子.pdf
アプリケーション識別子.pdfアプリケーション識別子.pdf
アプリケーション識別子.pdf
 
圧縮ネイティブ・ライブラリについて.pdf
圧縮ネイティブ・ライブラリについて.pdf圧縮ネイティブ・ライブラリについて.pdf
圧縮ネイティブ・ライブラリについて.pdf
 
分散環境におけるジャストインタイム設定の試み
分散環境におけるジャストインタイム設定の試み分散環境におけるジャストインタイム設定の試み
分散環境におけるジャストインタイム設定の試み
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
 
え!それって参照渡し?
え!それって参照渡し?え!それって参照渡し?
え!それって参照渡し?
 
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
プライバシーとセキュリティ(リモート通知のデバイストークンの扱いなど)
 
AppleScriptなど
AppleScriptなどAppleScriptなど
AppleScriptなど
 
MojaveのDark Mode
MojaveのDark ModeMojaveのDark Mode
MojaveのDark Mode
 
AppleScriptとは何ぞや
AppleScriptとは何ぞやAppleScriptとは何ぞや
AppleScriptとは何ぞや
 
Web API 通信の符号化について
Web API 通信の符号化についてWeb API 通信の符号化について
Web API 通信の符号化について
 
Master-Detail App を実装する
Master-Detail App を実装するMaster-Detail App を実装する
Master-Detail App を実装する
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
 
Getting a packet trace
Getting a packet traceGetting a packet trace
Getting a packet trace
 
The Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKitThe Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKit
 
RUDP
RUDPRUDP
RUDP
 
Swiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装するSwiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装する
 
ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦
 
IBM Watson Services for Core ML
IBM Watson Services for Core MLIBM Watson Services for Core ML
IBM Watson Services for Core ML
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
 

Recently uploaded

FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
CRI Japan, Inc.
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 

Recently uploaded (15)

FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 

OpenGLプログラミング

  • 1. OpenGLプログラミン グ Cocoa勉強会 関東 Swift勉強会 2018-01 2018/1/19 Bitz Co., Ltd. 村上幸雄
  • 2. • 埼玉県朝霞市でソフトハウスを起業。 • macOSやiOS、Androidのアプリケーション開発を主に請け負う。 • 自社アプリの製作。 • Twitter: @m_yukio • Facebook: yukio.murakami • GitHub: murakami • http://www.bitz.co.jp/weblog/
  • 3. BUKURO.swift • macOS/iOS/watchOS/tvOSプログラマーのための勉強会。 初心者大歓迎。 • Cocoa勉強会 関東とMOSAの合同勉強会。 ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催。 • 申し込みは、connpassから。 https://cocoa-kanto.connpass.com/ • プログラマーが楽しくプログラミングできるように • 勉強会に参加された方全員が学び得る場を提供! • 勉強会に参加できない方も学び得るよう、勉強会の成果を アウトプットする! • プログラマーの拠り所となる!
  • 5. void display(void) { /* カラーバッファの初期化 */ glClear(GL_COLOR_BUFFER_BIT); /* モデリング変換、z軸の負の方向に幾何形状を4単位移動する。 */ glLoadIdentity(); /* 単位行列 */ glTranslatef(0.0f, 0.0f, -4.0f); /* 幾何形状を描画する。 */ glCallList(gListID); /* バッファの入れ替え */ glutSwapBuffers(); assert(glGetError() == GL_NO_ERROR); }
  • 6. void resize(int w, int h) { /* ウィンドウ・サイズとOpenGLの座標を対応づける */ glViewport(0, 0, w, h); /* 投影行列とアスペクト比を更新する */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(50.0, (GLdouble)w / (GLdouble)h, 1.0, 10.0); /* 表示ルーチン用にモデルビューモードに設定する */ glMatrixMode(GL_MODELVIEW); assert(glGetError() == GL_NO_ERROR); gWidth = w; gHeight = h; }
  • 7. void init(void) { /* ディザ処理を無効にする */ glDisable(GL_DITHER); std::string ver((const char*)glGetString(GL_VERSION)); assert(! ver.empty()); std::istringstream verStream(ver); int major, minor; char dummySep; verStream >> major >> dummySep >> minor; const bool useVertexArrays = ((major >= 1) && (minor >= 1)); /* 三角形の頂点を定義する */ const GLfloat data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f }; if (useVertexArrays) { glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLAT, 0, data); } /* ディスプレイリストを作成する。 */ gListID = glGenLists(1); glNewList(gListID, GL_COMPILE); assert(glGetError() == GL_NO_ERROR); if (useVertexArrays) { glDrawArrays(GL_TRIANGLES, 0, 3); } else { glBegin(GL_TRIANGLES); glVertex3fv(&data[0]); glVertex3fv(&data[3]); glVertex3fv(&data[6]); glEnd(); } glEndList(); /* 描画 */ glutDisplayFunc(display); /* リサイズ処理 */ glutReshapeFunc(resize); } エラー
  • 8. int main(int argc, const char * argv[]) { @autoreleasepool { glutInit(&argc, (char **)argv); /* RGBカラーモード ダブルバッファ */ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); /* 初期ウィンドウ・サイズ */ glutInitWindowSize(gWidth, gHeight); /* 初期ウィンドウ位置 */ glutInitWindowPosition(500, 100); /* タイトルバー */ glutCreateWindow("IRIS GL"); /* 初期化 */ init(); /* 主ループ(イベント駆動) */ glutMainLoop(); } return 0; }
  • 11. フレームワークを追加 // // MyGLView.m // Crimson // // Created by 村上幸雄 on 2018/01/03. // Copyright © 2018年 Bitz Co., Ltd. All rights reserved. // @import GLKit; @import OpenGL; #import <OpenGL/OpenGL.h> #import <OpenGL/gl3.h> #import <OpenGL/glu.h> #import "MyGLView.h"
  • 12. NSOpenGLViewを継承したカ スタムビューを組み込む class ViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. /* 細かな背邸を行うため、コードで生成。 */ let viewFrame = self.view.frame let glView = MyGLView(frame: viewFrame) /* ウィンドウの大きさに追従して合わせる */ glView.translatesAutoresizingMaskIntoConstraints = true glView.autoresizingMask = NSView.AutoresizingMask(rawValue: NSView.AutoresizingMask.RawValue( UInt8(NSView.AutoresizingMask.width.rawValue) | UInt8(NSView.AutoresizingMask.height.rawValue))) self.view.addSubview(glView) } override var representedObject: Any? { didSet { // Update the view, if already loaded. } }
  • 13. カスタムビュー #import <Cocoa/Cocoa.h> @interface MyGLView : NSOpenGLView @end • わざわざSwiftは意味ないでしょう。 • 分かりやすい構成にするため、便利コードは控えます。
  • 14. 内部変数など @interface MyGLView () @property (nonatomic, assign) GLuint program; @property (nonatomic, assign) GLuint vertexShader; @property (nonatomic, assign) GLuint fragmentShader; @property (nonatomic, assign) GLuint vbo; /* vertex buffer object */ @property (nonatomic, assign) GLuint vao; /* vertex array object */ - (GLchar *)readResource:(NSString *)name ofType:(NSString *)ext; @end
  • 15. 初期化 - (instancetype)initWithFrame:(NSRect)frame { NSOpenGLPixelFormatAttribute attrs[] = { NSOpenGLPFAAllowOfflineRenderers, /* If present, this attribute indicates that offline renderers may be used. */ NSOpenGLPFAAccelerated, /* require hardware-accelerated pixelformat */ NSOpenGLPFADoubleBuffer, /* require double-buffered pixelformat */ NSOpenGLPFAColorSize, 32, /* require 32 bits for color-channels */ NSOpenGLPFADepthSize, 32, /* require a 32-bit depth buffer */ NSOpenGLPFAMultisample, NSOpenGLPFASampleBuffers, 1, /* Value is a nonnegative number indicating the number of multisample buffers. */ NSOpenGLPFASamples, 4, /* Value is a nonnegative indicating the number of samples per multisample buffer. */ NSOpenGLPFANoRecovery, NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, /* OpenGO最新版を指定 */ /* The requested profile must implement the OpenGL 3.2 core functionality. */ 0 }; NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; self = [super initWithFrame:frame pixelFormat:pixelFormat]; if (self) { [self setWantsBestResolutionOpenGLSurface:YES]; /* Retina Display対応 */ } return self; } Storyboardだとインスペクラでの設定になっ てしまうのをコードで設定。
  • 16. シェーダを取り込む - (void)prepareOpenGL { [super prepareOpenGL]; NSOpenGLContext *glContext = [self openGLContext]; self.vertexShader = glCreateShader(GL_VERTEX_SHADER); /* 頂点シェーダ・ハンドル */ const GLchar *vertexSource = [self readResource:@"MyShader" ofType:@"vsh"]; /* シェーダのソースコードの読み込み */ glShaderSource(self.vertexShader, 1, &vertexSource, NULL); /* シェーダのソースコードを設定 */ glCompileShader(self.vertexShader); /* コンパイル */ free((void *)vertexSource); self.fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); /* フラグメント・シェーダ・ハンドル */ const GLchar *fragmentSource = [self readResource:@"MyShader" ofType:@"fsh"]; /* シェーダのソースコードの読み込み */ glShaderSource(self.fragmentShader, 1, &fragmentSource, NULL); /* シェーダのソースコードを設定 */ glCompileShader(self.fragmentShader); /* コンパイル */ free((void *)fragmentSource); self.program = glCreateProgram(); /* プログラム・ハンドル */ glAttachShader(self.program, self.vertexShader); /* プログラムに頂点シェーダを割り当てる */ glAttachShader(self.program, self.fragmentShader); /* プログラムにフラグメント・シェーダを割り当てる */ glLinkProgram(self.program); /* リンク */
  • 17. vertex buffer object glGenBuffers(1, &_vbo); /* VBOを作成 */ glBindBuffer(GL_ARRAY_BUFFER, self.vbo); /* 頂点シェーダに渡すデータ配列 */ GLfloat data[] = { -0.8f, -0.8f, 0.0f, /* 頂点の座標 */ 1.0f, 0.0f, 0.0f, 1.0f, /* 頂点の色情報 */ 0.8f, -0.8f, 0.0f, /* 頂点の座標 */ 0.0f, 1.0f, 0.0f, 1.0f, /* 頂点の色情報 */ 0.0f, 0.8f, 0.0f, /* 頂点の座標 */ 0.0f, 0.0f, 1.0f, 1.0f, /* 頂点の色情報 */ }; glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 7 * 3, data, GL_STATIC_DRAW); /* GPUに転送 */
  • 18. vertex array object glGenVertexArrays(1, &_vao); /* VAOを作成 */ glBindVertexArray(self.vao); /* OpenGLコンテキストに結びつける */ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 7, (GLfloat *)0); /* インデックス0: 頂点の色情報 */ glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 7, ((GLfloat *)0) + 3); /* インデックス1: 頂点の色情報 */ glClearColor(0.2f, 0.4f, 0.6f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); [glContext flushBuffer]; }
  • 19. 描画 - (void)drawRect:(NSRect)dirtyRect { [super drawRect:dirtyRect]; glUseProgram(self.program); /* レンダリングで使用するシェーダを設定 */ glClearColor(0.2f, 0.4f, 0.6f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(self.vao); /* VAOを結びつける */ glEnableVertexAttribArray(0); /* 頂点属性を指定 */ glEnableVertexAttribArray(1); /* 頂点属性を指定 */ glDrawArrays(GL_TRIANGLES, 0, 3); /* レンダリング */ [[self openGLContext] flushBuffer]; }
  • 20. ビューポートを設定 - (void)drawRect:(NSRect)dirtyRect { [super drawRect:dirtyRect]; /* ビューポートのサイズ */ NSSize size = dirtyRect.size; size = [self convertSizeToBacking:size]; /* Retina対応 */ glViewport(0, 0, size.width, size.height); /* ビューポートの指定 */
  • 21. 頂点シェーダ #version 410 layout (location=0) in vec3 vertex_pos; /* 0番目の入力: 頂点の座標 */ layout (location=1) in vec4 vertex_color; /* 1番目の入力: 頂点の色情報 */ out vec4 color; /* フラグメント・シェーダに渡す色情報 */ void main() { gl_Position = vec4(vertex_pos, 1.0); /* 受け取った座標をそのままの位置に表示する */ color = vertex_color; } /* End Of File */
  • 22. フラグメント・シェー ダ #version 410 in vec4 color; /* 頂点シェーダから渡された色情報 */ layout (location=0) out vec4 frag_color; /* ピクセルの色 */ void main() { frag_color = color; /* 渡された色情報をそのまま出力 */ } /* End Of File */
  • 23.