2010-02-14 [長年日記]
■ [HG] 232本目
朝のうちはテイクオフの上にいい雲ができていていかにも上がりそうでしたが、組み終わって早めに出た人たちはそれほど上がらず、そうこうするうちに雲はなくなって微妙なコンディションに。
しばらく様子を見てから12時半にテイクオフ。テイクオフのすぐ西側で回して450mまで上がって周囲を探すもののあまりよいリフトはなくて、しばらくうろうろ。ようやく当たって600m。上がったり下がったりしながら抜けられないか探りましたが結局だれも650mの壁を抜けられなかったようです。
一緒に回していた人よりも風下に流されぎみで、風上でいい上がりをしているところに合流しなおすことになること数回。かと思えば、風上で上げていると、風下側で立ち上がっていておいていかれることも。もっと真剣にリフトを感じないといけないようです。
徐々に東風が強くなってきて山際が荒れてきたので前へ。ランディング手前であたったサーマルは、そのまま上がりそうでしたが、集中力を切らして外してしまいました。
そしてランディングはショートしてランディングの西側におりてしまいました。相変わらず上空が荒れていると、その時点で気持ちで負けて、ものが考えられなくなるようです。ランディングの吹流しは南だったものの、上空の東風に惑わされて西に回りこみすぎ、さらに風が結構しっかり吹いていることに気が回らずにショートするというだめっぷりでした。
滞空時間:50分 獲得高度:300m
2010-02-11 [長年日記]
■ [Haskell] HaskellでOpenGL (16)
描画するたびに頂点属性をメモリからGPUのメモリに転送するのを避けるには頂点バッファオブジェクトを使います。頂点バッファオブジェクトを使うと、頂点属性をGPUのメモリに置きっぱなしにできます。
作成するには、genObjectNamesで名前を作り、bindBufferでバインドし、bufferDataでデータを書き込みます。
使用するときには、bindBufferでバインドした状態で、VertexArrayDescriptorの最後の引数にバッファへのポインタの代わりに頂点バッファオブジェクト内でのオフセットを指定します。オフセットの指定には、IntPtrが使えます。
前回と変わったところだけ。
main =
do (progName, _) <- getArgsAndInitialize
initialDisplayMode $= [RGBAMode]
window <- createWindow "Window"
clearColor $= Color4 1.0 1.0 1.0 0.0
program <- join $ liftM2 createProgram (createShader vertexShaderSource)
(createShader fragmentShaderSource)
positionLoc <- get $ attribLocation program "a_position"
colorLoc <- get $ attribLocation program "a_color"
buffer <- createBuffer ([ 0.0, 0.9, 1.0, 0.0, 0.0,
-0.9, -0.9, 0.0, 1.0, 0.0,
0.9, -0.9, 0.0, 0.0, 1.0] :: [GLfloat])
displayCallback $= display program positionLoc colorLoc buffer
mainLoop
display program positionLoc colorLoc buffer =
do clear [ColorBuffer]
currentProgram $= Just program
bindBuffer ArrayBuffer $= Just buffer
vertexAttribPointer positionLoc $= (ToFloat, VertexArrayDescriptor 2 Float (toEnum (5*sizeOf(0 :: GLfloat))) (intPtrToPtr 0))
vertexAttribArray positionLoc $= Enabled
vertexAttribPointer colorLoc $= (ToFloat, VertexArrayDescriptor 3 Float (toEnum (5*sizeOf(0 :: GLfloat))) (intPtrToPtr (toEnum (2*sizeOf(0 :: GLfloat)))))
vertexAttribArray colorLoc $= Enabled
drawArrays Triangles 0 3
flush
createBuffer l =
do [buffer] <- genObjectNames 1
bindBuffer ArrayBuffer $= Just buffer
arr <- newListArray (0, length l - 1) l
withStorableArray arr $ \ptr ->
bufferData ArrayBuffer $= (toEnum (length l*sizeOf(head l)), ptr, StaticDraw)
bindBuffer ArrayBuffer $= Nothing
return buffer
2010-02-09 [長年日記]
■ [Haskell] HaskellでOpenGL (14)

色をつけるには、頂点シェーダにattribute変数を追加してプログラムから頂点ごとに色を渡すようにし、さらに頂点シェーダとフラグメントシェーダにvarying変数を追加して頂点シェーダからフラグメントシェーダに線形補間された色を渡します。
display program =
do clear [ColorBuffer]
currentProgram $= Just program
positionLoc <- get $ attribLocation program "a_position"
colorLoc <- get $ attribLocation program "a_color"
positions <- newListArray (0, 5) ([0.0, 0.9, -0.9, -0.9, 0.9, -0.9] :: [GLfloat])
colors <- newListArray (0, 9) ([1, 0, 0, 0, 1, 0, 0, 0, 1] :: [GLfloat])
withStorableArray positions $ \positionsPtr ->
withStorableArray colors $ \colorsPtr ->
do vertexAttribPointer positionLoc $= (ToFloat, VertexArrayDescriptor 2 Float 0 positionsPtr)
vertexAttribArray positionLoc $= Enabled
vertexAttribPointer colorLoc $= (ToFloat, VertexArrayDescriptor 3 Float 0 colorsPtr)
vertexAttribArray colorLoc $= Enabled
drawArrays Triangles 0 3
flush
vertexShaderSource = "attribute vec4 a_position; \
\attribute vec4 a_color; \
\varying vec4 v_color; \
\void main() { \
\ gl_Position = a_position; \
\ v_color = a_color; \
\}"
fragmentShaderSource = "varying vec4 v_color; \
\void main() { \
\ gl_FragColor = v_color; \
\}"
■ [Haskell] HaskellでOpenGL (15)
属性は先のように二つの配列で渡すこともできますが、一つにまとめることもできます。この場合、VertexArrayDescriptorのStrideに頂点間のバイト数を指定する必要があります。
display program =
do clear [ColorBuffer]
currentProgram $= Just program
attributes <- newListArray (0, 15) ([ 0.0, 0.9, 1.0, 0.0, 0.0,
-0.9, -0.9, 0.0, 1.0, 0.0,
0.9, -0.9, 0.0, 0.0, 1.0] :: [GLfloat])
positionLoc <- get $ attribLocation program "a_position"
colorLoc <- get $ attribLocation program "a_color"
withStorableArray attributes $ \ptr ->
do vertexAttribPointer positionLoc $= (ToFloat, VertexArrayDescriptor 2 Float (toEnum (5*sizeOf(0 :: GLfloat))) ptr)
vertexAttribArray positionLoc $= Enabled
vertexAttribPointer colorLoc $= (ToFloat, VertexArrayDescriptor 3 Float (toEnum (5*sizeOf(0 :: GLfloat))) (plusPtr ptr (toEnum (2*sizeOf(0 :: GLfloat)))))
vertexAttribArray colorLoc $= Enabled
drawArrays Triangles 0 3
flush
2010-02-08 [長年日記]
■ [Haskell] HaskellでOpenGL (13)
少し趣を変えてGLSLを使って書いたシェーダーを使う方法です。

シェーダーを使うには、頂点シェーダーとフラグメントシェーダーをコンパイルしてから、プログラムオブジェクトにアタッチし、そのプログラムオブジェクトをリンクして使います。実際に描く時には、vertexAttribPointerで頂点の属性を設定して頂点シェーダに情報を渡します。頂点の属性は、StorableArrayを使って配列へのポインタにして渡します。
以下の例では、フラグメントシェーダーは赤を返すように固定してあります。
import Control.Monad
import Data.Array.Storable
import Foreign.Ptr
import Graphics.Rendering.OpenGL
import Graphics.UI.GLUT
main =
do (progName, _) <- getArgsAndInitialize
initialDisplayMode $= [RGBAMode]
window <- createWindow "Window"
clearColor $= Color4 1.0 1.0 1.0 0.0
program <- join $ liftM2 createProgram (createShader vertexShaderSource)
(createShader fragmentShaderSource)
displayCallback $= display program
mainLoop
display program =
do clear [ColorBuffer]
currentProgram $= Just program
loc <- get $ attribLocation program "a_position"
positions <- newListArray (0, 5) ([0.0, 0.9, -0.9, -0.9, 0.9, -0.9] :: [GLfloat])
withStorableArray positions $ \ptr ->
do vertexAttribPointer loc $= (ToFloat, VertexArrayDescriptor 2 Float 0 ptr)
vertexAttribArray loc $= Enabled
drawArrays Triangles 0 3
flush
vertexShaderSource = "attribute vec4 a_position; \
\void main() { \
\ gl_Position = a_position; \
\}"
fragmentShaderSource = "void main() { \
\ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \
\}"
createShader source =
do [shader] <- genObjectNames 1
shaderSource shader $= [source]
compileShader shader
return shader
createProgram vertexShader fragmentShader =
do [program] <- genObjectNames 1
attachedShaders program $= ([vertexShader], [fragmentShader])
linkProgram program
return program
2010-01-31 [長年日記]
■ [HG] 231本目
朝の早いうちは日が少し出ていましたが、その後完全に曇り。12時頃から雲の隙間から日が差すようになり、かろうじて浮いていられそうになった12時半頃テイクオフ。
西の斜面でテイクオフから30mくらい下の高さまで戻すもののまた下がり、対地で200mを切った状態で15分ほどひたすらがんばってようやく稜線より上へ。稜線より上は少し荒れているものの楽に上がる状態。
少し沖の方も少し渋いけれど荒れていないので飛びやすい雰囲気。東の尾根の向こうは上がるものかなり荒れていました。
人が多くて少し気まずくなるも、しばらくすると少し渋くなってかなりの機体がランディングへ。グライドの練習をしたり、低いところから上げなおしたりする練習を繰り返してからランディングへ。
どこへも行けませんでしたが、なかなか楽しく飛べました。
滞空時間:1時間15分 獲得高度:250m
# 名無しさん [すみません。ランディングとは関係のないQMAIL3の件でコメントさせていただきます。 BTSに新規レポートを投稿す..]
# snak [BTSの調子が悪くてお手数をお掛けします。とりあえず、1490以外は削除しておきました。]