2019年9月15日日曜日

rawファイルを作成して、rawファイルをテクスチャとして貼りました


                               ウィンドウ名がちがってますね


                                                               X
#!/usr/bin/env python
#coding:utf-8

#ファイル名 texture_raw.py

#参考サイト
#OpenGl勉強会用資料のページ テクスチャマッピング
# http://www.oit.ac.jp/is/L231/~whashim^U/Article/OpenGL/Chapter7/index.html
#OpenGL de プログラミング
# https://seesaawiki.jp/w/mikk_ni3_92/d/TGA%B2%E8%C1%FC%C6%C9%A4%DF%B9%FE%A4%DF
#OpenCVで画像を読み込んでOpenGLで表示
# http://blog.livedoor.jp/tmako123-programming/archives/16882784.html

"""
@@@ rawファイルをテクスチャとして貼る
@@@ rawファイル作成しました


rawファイルにはそれ自身にはファイルの縦横のピクセル数、rgbかrgbaか
のデータがないので作成者が覚えていないとだめ
ウェブ上でjpgファイル等をrawファイルに変換したけれど、それではだめだっ
た。

rawファイル作成方法
床井研究室
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040913
Photoshop(Elements でも可)や GIMP などを使って,テクスチャに使う画像
を作ります.画像のモードは,ここでは「RGB モード」にします.また画像の
サイズは,縦横 256×256 とか 512×128 という風に,2n 画素にします.
OpenGL のテクスチャマッピングにおけるこの制限は,テクスチャを部分的に
置き換える glTexSubImage2D() を使うならあまり気にする必要はありません
.また OpenGL 2.0 では,この制限自体が撤廃されています.しかし,ここで
はこの OpenGL の伝統的なマナーに従うことにします.

と述べれているけれど素人には簡単すぎてわからない。

[GIMP] GIMPでRAWデータを作る
http://www.cho-design-lab.com/2015/05/21/gimp-raw-image/
でrawファイルのどんな画像なのかわかってよかった。
この方法でraw画像を作成した。

画像が上下反転してしまう。
https://nemumitakamaru.hatenablog.com/entry/2018/12/24/115151
ねむみ高まる
が参考になる。
面倒なのでopenCVで画像を反転さそうとしたらrawファイルは
受け付けないようだ。
ごく普通に座標の割当を上下逆にする。
"""

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys

spin=0.0


#jpgファイルの場合texturesクラスを使わないでやろう
##画像ファイル管理用構造体もどき
##ダミーで数値を入れる
class textures:
    imageData = [] #イメージデータ(32ビットまで)                                   
    width  = 256             # 横幅                                                       
    height = 256            # 高さ                                                     
    bytesPerPixel = 3
    texID  = 0          #ID(複数使用時)                                           


#rawファイル読み込み
def Loadim(texture, filename):
    imagesize = texture.width * texture.height * texture.bytesPerPixel
    tmp        = 0
    type       = GL_RGB
    flg_ferror = 0

    #rgbaなら4 rgbなら1?
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    try:
        f = open(filename, 'rb')
    except:
        print "画像ファイル読み込めませんでした。"
        flg_ferror = 1
        sys.exit()

    for size in range(imagesize):
        byt = f.read(1)
        #ファイルのeofにきた。
        if byt == '':
            flg_ferror = 1
            break
        acode = ord(byt)
        texture.imageData.append(acode)
    imagesize = len(texture.imageData) + 1

    if flg_ferror == 1:
        f.close()
    f.close()

    #テクスチャ作成 IDで分ける
    glGenTextures(1, texture.texID)

    #バインドなど
    glBindTexture(GL_TEXTURE_2D, texture.texID)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)

    glTexImage2D(GL_TEXTURE_2D, 0, type,
            texture.width, texture.height,
                 0, type, GL_UNSIGNED_BYTE, texture.imageData)


def displayTexPolygon():
    #テクスチャマッピングを有効にしておきます
    #左下が0,0 だがそうすると画像が上下反転してしまう
    glEnable(GL_TEXTURE_2D)
    glBegin(GL_QUADS)
    glTexCoord2f(0.0, 1.0)
    glVertex3f(-5.0,-5.0, 0.0)
    glTexCoord2f(0.0, 0.0)
    glVertex3f(-5.0, 5.0, 0.0)
    glTexCoord2f(1.0, 0.0)
    glVertex3f( 5.0, 5.0, 0.0)
    glTexCoord2f(1.0, 1.0)
    glVertex3f( 5.0,-5.0, 0.0)
    glEnd()
    glDisable(GL_TEXTURE_2D)


def display():
    global spin
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glPushMatrix()

    glTranslatef(0.0, 0.0,-7.0)
    glRotatef(spin, 0.0, 1.0, 0.0)
    glColor3f(1.0, 1.0, 1.0)
    displayTexPolygon()

    spin+=1.0
    glPopMatrix()
    glFlush()
    glutSwapBuffers()


def init() :
    glClearColor(0.0, 0.0, 0.0, 0.0)
    glDepthFunc(GL_LEQUAL)

    glEnable(GL_DEPTH_TEST)
    #サイコロの1から6までの画像 後で1だけ取り出す
    #Loadim("dice.jpg")
    #Loadim("test0_texture.jpg")
    #Loadim(textures, "test0_22.raw")
    Loadim(textures, "raw_make2.data")
    #initTexture()
    #glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    #glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    #glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    #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, GL_RGBA, TEX_WIDTH, TEX_HEIGHT,
    #    0, GL_RGBA, GL_UNSIGNED_BYTE, image)


def reshape(w, h):
    glViewport(0, 0,  w,  h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(-5.0, 5.0,-5.0, 5.0, 5.0, 500.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode (GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA)
    glutInitWindowSize (250, 250)
    glutInitWindowPosition (100, 100)
    glutCreateWindow ("tgaファイルテクスチャ")
    init()
    #glutIdleFunc(display)     
    glutDisplayFunc(display)
    glutReshapeFunc(reshape)
    glutMainLoop()


if __name__ == "__main__":
    main()
                                                                                187,2-5      末尾


0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts