2010-03-14 [長年日記]
■ [HG] 234本目
11時半過ぎにテイクオフ。西の斜面で上げて700m。リフトも強いけれどシンクも強くて、荒れた中を上がったり下がったりしながら400mくらいまで落ち、ようやくしっかりしたリフトで900mまで。
-5m/sくらいのシンクを突っ切って東側へ。あまり上がらないけれど、その間に西側はかなり強い下降流に飲み込まれていたらしく、飛んでいた人はほとんどランディングへ。
西側に戻ってきたら強いサーマルで一気に1000m弱。途中は+8m/sくらいで上がるところもあって、強いGでちょっと気持ち悪くなり沖のほうへ。さすがに山から離れると少し穏やかになっていて、弱いリフトで気持ちよく回していると、徐々に+2m/sくらいまで育って900m弱。
ここから西側の山に寄せるか、南に進むか考えたのですが、山際はあまり雰囲気が良くなさそうなので南にグライド。2kmほどグライドしてもリフトに当たらず、一回引き返して上げなおそうとしたらリフトがなくなっていてそのままランディングへ。
同じ場所から山へ寄せた人は、荒れていたらしいもののまだまだ飛んでいたので、やっぱり山に張り付いた方が良かったのかもしれません。
滞空時間:1時間 獲得高度:600m
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