質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Q&A

解決済

2回答

1396閲覧

OpenGLでテクスチャを実装しようとすると画像にノイズが入ります

motyaa

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

0グッド

0クリップ

投稿2018/01/20 14:00

編集2018/01/22 13:55

###前提・実現したいこと
OpenGLを使って簡単なCGを作っています。
2つアニメーションを実装している立方体があるうち、中心の立方体の6面にストラクチャを貼ろうとしたところ、実行時エラーが発生しました。
試しに、1つのポリゴンを表示するようにしているところです。

###発生している問題・エラーメッセージ
テクスチャの画像に下の実行結果のようなノイズが入ってしまう。

###該当のソースコード

c

1#include <stdio.h> 2#include <GLUT/glut.h> 3#include <stdlib.h> 4 5#define KEY_ESC 27 6 7/*Gold*/ 8float diffuse[]={0.7, 0.6, 0.2, 1.0}; //拡散反射成分(R,G,B,A強度0.0〜1.0) 9float specular[]={0.6, 0.5, 0.4, 1.0}; //鏡面反射成分(R,G,B,A強度0.0〜1.0) 10float ambient[]={0.3,0.2,0.1,1.0}; //環境光反射成分(R,G,B,A強度0.0〜1.0) 11float shininess=10.0; //鏡面光の鋭さ(0.0〜128.0) 12 13double param_big = 0.0; 14double param_small = 0.5; 15 16/* Texture */ 17#define TEXWIDTH 256 18#define TEXHEIGHT 256 19//#define TEXWIDTH 512 20//#define TEXHEIGHT 512 21static const char texture1[] = "./image01.data"; 22//static const char texture2[] = "sample.data"; 23 24void myKbd(unsigned char key,int x, int y){ 25 if(key==KEY_ESC)exit(0); 26} 27void texture_map(void){ 28 // --------- テクスチャマッピング開始 ------------- 29 glEnable(GL_TEXTURE_2D); 30 glNormal3d(0.0,0.0,1.0); //法線ベクトルの設定 31 glBegin(GL_QUADS); 32 glTexCoord2d(0,1); glVertex3d(-1,-1,0); //左下 33 glTexCoord2d(1,1); glVertex3d(1,-1,0); //左上 34 glTexCoord2d(1,0); glVertex3d(1,1,0); //右上 35 glTexCoord2d(0,0); glVertex3d(-1,1,0); //右下 36 //上面 37// glTexCoord2d(0.0,1); glVertex3d(0.0,0.0,0.0); //左下 38// glTexCoord2d(0.0,0.0); glVertex3d(1,0.0,0); //左上 39// glTexCoord2d(1,0.0); glVertex3d(1,0,-1); //右上 40// glTexCoord2d(1,1); glVertex3d(0,0.0,-1); //右下 41 //底面 42// glTexCoord2d(0.0,0.5); glVertex3d(0,-0.5,0); //左下 43// glTexCoord2d(0.0,0.0); glVertex3d(0,-0.5,-0.5); //左上 44// glTexCoord2d(0.5,0.0); glVertex3d(0.5,-0.5,-0.5); //右上 45// glTexCoord2d(0.5,0.5); glVertex3d(0.5,-0.5,0.0); //右下 46// //左側 47// glTexCoord2d(0.0,0.5); glVertex3d(0.0,-0.5,0.0); //左下 48// glTexCoord2d(0.0,0.0); glVertex3d(0.0,0.0,0.0); //左上 49// glTexCoord2d(0.5,0.0); glVertex3d(0.0,0.0,-0.5); //右上 50// glTexCoord2d(0.5,0.5); glVertex3d(0.0,-0.5,-0.5); //右下 51// //奥側 52// glTexCoord2d(0.0,0.5); glVertex3d(0.0,-0.5,-0.5); //左下 53// glTexCoord2d(0.0,0.0); glVertex3d(0.0,0.0,-0.5); //左上 54// glTexCoord2d(0.5,0.0); glVertex3d(0.5,0.0,-0.5); //右上 55// glTexCoord2d(0.5,0.5); glVertex3d(0.5,-0.5,-0.5); //右下 56// //右側 57// glTexCoord2d(0.0,0.5); glVertex3d(0.5,-0.5,0.0); //左下 58// glTexCoord2d(0.0,0.0); glVertex3d(0.5,0.0,0.0); //左上 59// glTexCoord2d(0.5,0.0); glVertex3d(0.5,0,-0.5); //右上 60// glTexCoord2d(0.5,0.5); glVertex3d(0.5,-0.5,-0.5); //右下 61// //手前側 62// glTexCoord2d(0.0,0.5); glVertex3d(0.0,-0.5,0.0); //左下 63// glTexCoord2d(0.0,0.0); glVertex3d(0.0,0.0,0.0); //左上 64// glTexCoord2d(0.5,0.0); glVertex3d(0.5,0.0,0.0); //右上 65// glTexCoord2d(0.5,0.5); glVertex3d(0.5,-0.5,0.0); //右下 66 glEnd(); 67 glDisable(GL_TEXTURE_2D); 68 // --------- テクスチャマッピング終了 ------------- 69} 70void display(void){ // ディスプレイコールバック関数 71 72 // -------いつも必要な関数---------------- 73 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //デプスバッファの設定(隠面消去のため) 74 glEnable(GL_DEPTH_TEST); 75 glPushMatrix(); 76 // ------------------------------------ 77 78 gluLookAt(3.0, 3.0, 5.0, // 視点の位置 79 0.0, 0.0, 0.0, // 見たいものの位置 80 0.0, 1.0, 0.0); // 画像のどこが上なのかを指定(ベクトル) 81 glColor4f(0.0,0.0,0.0,1.0); 82 83 // --------- 外側の直方体 回転 ------------------ 84 glPushMatrix(); //現在の座標系を保存 85 glRotatef(45.0*(float)param_big,1.0,0.0,0.0); //座標系をy軸周りに(45 × i)度回転 86 87 88 glPushMatrix(); //回転した状態の座標系を保存 89 glTranslatef(0.0,0.0,-1.0); //座標系を平行移動 90 91 //課題2 92 glPushMatrix(); //現在の座標系を保存 93 glRotatef(-45.0*(float)param_big,1.0,0.0,0.0); //座標系をy軸周りに(45 × i)度回転 94 // -------------------------------------------- 95 96 //立方体の描画(外側) 97 glLineWidth(2.0); 98 glutWireCube(2.0); 99 100 glPopMatrix(); //平行移動前の座標系を復元 101 glPopMatrix(); //平行移動も回転もしていない元の座標系を復元 102 glPopMatrix(); 103 104 // 照明をON 105 // glEnable(GL_LIGHT0); 106 // glEnable(GL_LIGHTING); 107 108 //表面属性の設定 109 glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse); 110 glMaterialfv(GL_FRONT,GL_SPECULAR,specular); 111 glMaterialfv(GL_FRONT,GL_AMBIENT,ambient); 112 glMaterialf(GL_FRONT,GL_SHININESS,shininess); 113 114 115 // ------ 中心の直方体 回転 ----------- 116 glPushMatrix(); //現在の座標系を保存 117 glRotatef(-45.0*(float)param_small,1.0,0.0,0.0); //座標系をy軸周りに(45 × i)度回転 118 119 120 glPushMatrix(); //回転した状態の座標系を保存 121 glTranslatef(0.0,0.0,-1.0); //座標系を平行移動 122 123 glPushMatrix(); //現在の座標系を保存 124 glRotatef(45.0*(float)param_small,1.0,0.0,0.0); //座標系をy軸周りに(45 × i)度回転 125 // ---------------------------- 126 127 texture_map(); 128 129 glPopMatrix(); //平行移動前の座標系を復元 130 glPopMatrix(); //平行移動も回転もしていない元の座標系を復元 131 glPopMatrix(); 132 133 glPopMatrix(); //座標系の復帰 134 glDisable(GL_DEPTH_TEST); //デプスバッファ更新を無効にする(隠面消去OFF) 135 glutSwapBuffers(); 136} 137void myReshape(int width, int height){ 138 double aspect = (double)width/(double)height; 139 140 glViewport(0,0,width,height); 141 glMatrixMode(GL_PROJECTION); 142 glLoadIdentity(); 143 gluPerspective(30.0,aspect,1.0,100.0); //透視投影の設定 144 glMatrixMode(GL_MODELVIEW); 145} 146 147void myMouse(int button,int state, int x,int y){ //マウスコールバック関数 148 if(state == GLUT_DOWN){ 149 switch(button){ 150 case GLUT_LEFT_BUTTON: 151 exit(-1);break; 152 } 153 } 154} 155void init(char *progname){ //初期化関数 156 int width = 500, height = 500; 157 158 glutInitWindowPosition(0,0); 159 glutInitWindowSize(width,height); 160 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); //デプスバッファの設定(隠面消去のため) 161 glutCreateWindow(progname); 162 glClearColor(1.0,1.0,1.0,1.0); 163 164//テクスチャ画像の読み込み 165GLubyte texture[TEXHEIGHT][TEXWIDTH][3]; 166FILE *fp; 167if((fp=fopen("./image01.data","rb")) != NULL){ 168 fread(texture, sizeof texture, 1,fp); 169 fclose(fp); 170}else{ 171 // 任意のエラー処理を記述 172 perror(texture1); 173} 174glPixelStorei(GL_UNPACK_ALIGNMENT,1); //アライメント(データの格納方法)の設定 175 176glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXWIDTH, TEXHEIGHT, 0, 177 GL_RGB, GL_UNSIGNED_BYTE, texture); //画像データをテクスチャメモリにセットする 178 179//テクスチャパラメータの設定(テクスチャマッピングの拡大・縮小法の設定) 180glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 181glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 182 183//テクスチャの合成環境の設定(ポリゴンの陰影等をテクスチャに反映する等の設定) 184glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); 185} 186 187void idle(void){ 188 param_big +=0.1; 189 param_small += 0.05; 190 glutPostRedisplay(); 191} 192 193int main(int argc,char *argv[]){ //メイン関数 194 glutInit(&argc,argv); 195 196 init(argv[0]); 197 glutReshapeFunc(myReshape); 198 glutDisplayFunc(display); 199 glutKeyboardFunc(myKbd); 200 glutMouseFunc(myMouse); 201 //課題3 202 glutIdleFunc(idle); 203 glutMainLoop(); 204 205 return 0; 206} 207

実行結果

result.png

###補足情報(言語/FW/ツール等のバージョンなど)
C言語

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

init関数内で、windowを作成する前にテクスチャ描画部分を呼び出していたため、エラーが出ていました。記述順を変えると実行できました。

投稿2018/01/22 01:07

motyaa

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2018/01/22 03:37

動きましたか!あとはテクスチャ座標をうまく設定して、各面に意図通りの絵を貼る作業ですね。ご不明点がありましたら、私の分かる範囲であればなるべくお力になりたいと思います。 ※今はコメントアウトされているようですが、今後照明効果も加えるようでしたら、立方体の各面ごとに正しく法線を設定してやる必要があるでしょう。現状では全頂点の法線が(0.0,0.0,1.0)になっており、陰影がおかしくなってしまうかと思います。
motyaa

2018/01/22 04:03

ご返信ありがとうございます。 実行は成功したのですが、ポリゴンに対してテクスチャにノイズが入って出力されてしまいます。 また、法線ベクトルについてかしこまりました。ここで上面の法線ベクトルは上向きだからy=1.0だという考えで間違えないでしょうか?
Bongo

2018/01/22 05:49

はい、法線ベクトルの件についてはその解釈で問題ないかと思います(同じく、底面なら(0.0, -1.0, 0.0)、左面なら(-1.0, 0.0, 0.0)、奥面なら(0.0, 0.0, -1.0)...)。 glNormal3dやglTexCoord2dは、一度実行すれば次にglNormal3d、glTexCoord2dを実行するまで同じ値が維持されるはずですので、glNormal3dは各面ごとに一回ずつ(「//上面」、「//底面」...のコメントの次の行にでも)設定してやれば充分かと思います。 テクスチャにノイズが入る現象ですが、もしかしてご質問者さんの場合、テクスチャデータファイルをGIMPで作成されていませんでしょうか? といいますのも、「床井研究室 - 第1回 画像の読み込み」(http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040913 )の一番下、コメント欄でのやりとりを見ますと、どうもGIMPが出力するファイルはRGBAの4チャンネルになってしまうらしいのです。 もしこの状況に該当しそうであれば、コメント欄のお返事にあるように、読み込み元ピクセルフォーマットをGL_RGBAに変更するとどうなるか試してみてください。
motyaa

2018/01/22 07:22

お返事大変ありがとうございます。おっしゃる通り、画像はGIMPでエクスポート致しましたが、出力はRGBの3値で出力したため、問題ないと思ったのですがうまく描画されません。 また、この画像を使えば問題ないと言われて渡された画像に変更して実行して見たのですが同じ結果となりました。
Bongo

2018/01/22 08:00

なるほど...サイトの方のコメントですと、RGBで出力してもRGBAになってしまうらしいのですが、念のためファイルサイズを確認していただけませんか? 正しくRGBのみになっていれば(幅256×高さ256×3チャンネル)÷1024 = 192KB、もしRGBAになってしまっていれば(幅256×高さ256×4チャンネル)÷1024 = 256KBになると予想されます。 しかし、「正しく表示されるはず」との画像までおかしくなっているということは、原因はファイルではないのかもしれませんね... そのおかしな表示というのはどのようなものでしょうか。ノイズの入り方は、元の画像であることが分かるレベルなのか、あるいは砂嵐状で意味不明な見た目になってしまうのか...このあたりもヒントになるかもしれません。 その他試してみることとして思いつくのは、ピクセル内部フォーマットをちゃんとサイズ指定付きのものに変えてみる...とかですかね。 glTexImage2Dの3番目の引数を変えて、glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, TEXWIDTH, TEXHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texture);にしてみると違いが出るでしょうか?
motyaa

2018/01/22 08:26

お返事ありがとうございます。 質問内容を編集し、実行結果のスクリーンショットを添付、コードの更新を行いました。 もしお時間ございましたらご覧ください。 また、テクスチャのファイルサイズを確認したところ、66KBでした。 256×256のbmp形式の画像をGIMPで読込み、RAWデータにエクスポートしたのですが、192KBにはなりませんでした。 そしてglTexImage2Dの3番目の引数を変えて、glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, TEXWIDTH, TEXHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); に変更して実行したところ、実行結果に変化はありませんでした。
Bongo

2018/01/22 13:32

すみません、せっかく画像を用意していただいたのに、なぜか表示されていませんでした...teratailの不具合でしょうか...? もし画像をうまくアップロードできないようでしたら、私の方は別にteratail上でなくとも、どこかのアップローダーをご使用いただいてもまったく構いません。 ファイルサイズ66KBというのは妙に小さすぎる気がします。単純に考えて、256×256×3のGLubyte配列(196608バイト→192KB)にファイルの中身を丸ごと入れるなら、ファイルサイズも同じく192KBなければならないはずです。なんだか再びテクスチャファイルの方が怪しく思えてきました... 私もGIMP 2.8.22をダウンロードしてRAW画像エクスポートを試してみましたが、フォーマットに関しては、確かにおっしゃるとおり、ちゃんとRGB3チャンネルになるようですね。ただ、私の場合は意図通り192KBになっていました。ご質問者さんと何が違うんでしょうか? 一応、私の試したエクスポート手順を、以前の回答の後ろに追記しました。もし相違点などお気づきになりましたらコメント願います。
motyaa

2018/01/22 13:57 編集

コメントありがとうございます。 先程質問を編集し、画像を再添付致しました。 もう一度画像ファイルを確認してみます。
Bongo

2018/01/22 22:04

ご添付の画像見えました。ありがとうございます。 画像を見て思いついたことを述べさせていただきますと... - ちゃんとレナの姿が見えているということは、圧縮されていたわけではなさそう - 上1/3しか意味ありそうな絵は表示されていない、つまりファイルサイズは1/3→64KB? - 66KB - 64KB = 2KBのズレはあるがひとまず無視し(どうもFinderの「情報を見る」だと、メタデータ類も含めたサイズを表示しているのか、少し大きくなるっぽいです)64KBと仮定 - ファイルの正体は256×256のRAWグレースケール1チャンネル画像ではないか こう考えると、ノイズ画像は... - 連続したグレースケール3ピクセルがRGB1ピクセルと見なされて描画される - 画像の変化が緩やかな部分は隣り合ったピクセルが似ているため、描画された映像も元とほぼ同じグレーに見える - 画像の変化が大きい部分(帽子の飾りなど)ではRGBに異なるデータが入り、カラフルなノイズとなる - 一行のデータ量は256×3バイトだが、これに1チャンネルのデータを詰め込んだので、元画像の1行目〜3行目が描画結果の1行目に押し込まれる→隣り合った行は互いに似ているので、あたかも横に3回繰り返して描画されたように見える - 描画結果の下2/3はGLubyte配列の未初期化部分に残っていたピットパターンが表示されたもの と説明できそうです。 なぜこうなったかの可能性ですが、もしかしてGIMPで画像を編集する際、タイトルバーに「(グレースケール, 1枚のレイヤー)」と表示されていませんでしたか? 私の試したところでは、この状態でRAWエクスポートすると1チャンネルデータになってしまうようです。 メニューの「画像(I)」→「モード(M)」→「RGB(R)」を選択して、タイトルバーが「(RGBカラー, 1枚のレイヤー)」に変わったのを確認し、これをRAWエクスポートしたところ意図通り192KBのファイルが生成されました。 もしこんな状況の可能性がありましたらお試しください。
motyaa

2018/01/22 22:52

丁寧なアドバイス大変助かります。 学校に着きましたらその旨確認してみます。 それでは、またご連絡させていただきます。
motyaa

2018/01/23 04:05

只今、頂いたご指摘を試したところ、192KBとなり、うまく描画されました。 やはりタイトルバーに「(グレースケール, 1枚のレイヤー)」と表示されていたため、ファイルサイズに不具合が起きていました。 小さなミスで申し訳ありません。 ありがとうございます。大変感謝しています。
Bongo

2018/01/23 04:37

いえいえ、お気になさらないでください。私としても推理ゲームのようで面白かったです。学習がんばってください!
guest

0

ベストアンサー

昔のOpenGLは自信がないですが、初期化時にウィンドウを作成するより前に(OpenGLコンテキストがない状態で)OpenGLの関数を使用しようとしているのがよくないかもしれません。

順序をちょっと入れ替えて、下記のようにしてみると変化はあるでしょうか?

C

1void init(char *progname) { //初期化関数 2 //テクスチャ画像の読み込み 3 GLubyte texture[TEXHEIGHT][TEXWIDTH][3]; 4 FILE *fp; 5 if ((fp = fopen(texture1, "rb")) != NULL) { 6 fread(texture, sizeof texture, 1, fp); 7 fclose(fp); 8 } 9 else { 10 // 任意のエラー処理を記述 11 printf("texture not founed"); 12 } 13 14 // ウィンドウ作成部分を「gl...」で始まる関数の使用箇所よりも手前に移動 15 int width = 500, height = 500; 16 17 glutInitWindowPosition(0, 0); 18 glutInitWindowSize(width, height); 19 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); //デプスバッファの設定(隠面消去のため) 20 glutCreateWindow(progname); 21 22 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //アライメント(データの格納方法)の設定 23 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEXWIDTH, TEXHEIGHT, 0, GL_RGB, 24 GL_UNSIGNED_BYTE, texture); //画像データをテクスチャメモリにセットする 25 26 //テクスチャパラメータの設定(テクスチャマッピングの拡大・縮小法の設定) 27 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 28 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 29 30 //テクスチャの合成環境の設定(ポリゴンの陰影等をテクスチャに反映する等の設定) 31 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 32}

glTexCoord2dがよく分からないとのことですが、これはある頂点がテクスチャ画像中のどこに対応するかを指定するものです。
もしプログラムの実行がうまくいくようになりましたら、その後で実際にこの座標をいろいろ書き換えてみるのがいいかと思います。もし立方体の各面で同じ座標を指定したとすると、おそらくどの面にも同じ絵が貼り付けられた立方体ができあがるかと予想されます。

画像のどの部分がテクスチャ座標のどこに対応するかは、床井研究室 - 第2回 テクスチャの割り当て床井研究室 - 第5回 テクスチャ座標がご参考になるでしょうか(サイトのコードとご質問者さんのコードが似ておりますので、すでにご覧になっているかもしれませんが...)。

※ちなみに、タイトルや本文の「ストラクチャ」は「テクスチャ」のことですかね?

###追記
Mac版GIMP 2.8.22でのRAW画像エクスポートを試してみましたので追記します。
サイズ256×256の画像全体をR 0、G 128、B 255の単色で塗りつぶして...
GIMP1
下図の設定でエクスポートしました(名前はtest.data)。
GIMP2
このファイルを、ターミナル上にてlsで見てみると、ファイルサイズは意図通り192KB(196608バイト)、odで見てみると、同じく意図通り中身は「00 80 ff 00 80 ff...(10進数だと0 128 255 0 128 255...)」が延々と続いていました。
Terminal
ご質問者さんのテクスチャデータファイルをodで見てみる、あるいは適当なバイナリファイルエディタで開いてみると、中身はどうなっているでしょうか?意図通りエクスポートされていれば、ピクセルの色がそのまま「R G B R G B...」と並んでいるはずですが、もし何らかの圧縮がされていれば、意図とは違うバイト列になっているはずです(そして、サイズも192KBになっていないと思います)。ファイルサイズが66KBしかないというのがどうも気になるのですが、いかがでしょうか。

投稿2018/01/21 07:25

編集2018/01/22 13:31
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

motyaa

2018/01/22 01:02

コメントありがとうございます。 おっしゃる通り、床井研究室のページを参考にして作成しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問