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

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

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

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

OpenGL

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

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Q&A

解決済

1回答

3435閲覧

c++でGLSLが動かない

ukey

総合スコア12

C

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

OpenGL

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

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

0グッド

0クリップ

投稿2017/09/03 03:10

###c++でopenglを実装したい
今までwebglを触ってきたのですが,openglを触ってみたいと思い,昨日から実装をしてみています
c++で実装を行っています.c++を今までほとんど触ったことがなく,かなり苦戦しています.
ウィンドウを表示し,背景の初期化まではできているのですが,どうしてもglslで記述した部分が表示されていません.(赤い三角形を表示するプログラムのはずです)
エラーは出ていません.何分c++自体よくわかっていないもので,includeなどが正しくできているのかさえちょっとわかっていません.
また,webglの書き方と似せているのでもしかしたら古い書き方なのか...?という部分が多々あります.
外部ファイルの読み込みやプログラムへのヒモ付は恐らく正しく動作しています.ので,個人的にはglBufferDataなどのメモリへのヒモ付ができていないのか....?とか思っております.(よく理解していないので).とりあえずvboらへんが怪しいと思っています.
下にコードが記載されています.コードを分けることにもなれていないもので少しみづらいのですがよろしくお願いいたします.

###試したこと
include <OpenGL/gl.h>と include <OpenGL/gl.h>を include <GL/glew.h>に差し替えてみたりもしました.しかしこっちはエラーが出て全然動きませんでした.

###補足情報(言語/FW/ツール等のバージョンなど)
OSはmacOS X El Capitan version 10.11.3です
コンパイルは
clang++ -o main main.cpp -lglfw -framework OpenGL

g++ -o main main.cpp -lglfw -framework OpenGL
で通してみています

c++

1#include <iostream> 2#include <string> 3#include <OpenGL/gl.h> 4#include <OpenGL/glext.h> 5#include <GLFW/glfw3.h> 6 7using namespace std; 8 9//シェーダ読み込み時のデバッグ 10void printShaderInfoLog(GLuint shader) 11{ 12 GLsizei bufSize; 13 glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &bufSize); 14 if (bufSize > 1) { 15 GLchar *infoLog; 16 infoLog = (GLchar *)malloc(bufSize); 17 if (infoLog != NULL) { 18 GLsizei length; 19 glGetShaderInfoLog(shader, bufSize, &length, infoLog); 20 fprintf(stderr, "InfoLog:\n%s\n\n", infoLog); 21 free(infoLog); 22 } 23 else 24 fprintf(stderr, "Could not allocate InfoLog buffer.\n"); 25 } 26} 27//プログラム作成時のデバッグ 28void printProgramInfoLog(GLuint program) 29{ 30 GLsizei bufSize; 31 glGetProgramiv(program, GL_INFO_LOG_LENGTH , &bufSize); 32 if (bufSize > 1) { 33 GLchar *infoLog; 34 infoLog = (GLchar *)malloc(bufSize); 35 if (infoLog != NULL) { 36 GLsizei length; 37 glGetProgramInfoLog(program, bufSize, &length, infoLog); 38 fprintf(stderr, "InfoLog:\n%s\n\n", infoLog); 39 free(infoLog); 40 } 41 else 42 fprintf(stderr, "Could not allocate InfoLog buffer.\n"); 43 } 44} 45//シェーダ読み込み 46GLuint create_shader(const char* id) { 47 GLuint shader; 48 GLint compiled; 49 FILE *fp; 50 const GLchar *source; 51 GLsizei length; 52 int ret; 53if(strncmp(id,"vs",2) == 0){ 54 fp = fopen("vertex.glsl", "r"); 55 shader = glCreateShader(GL_VERTEX_SHADER); 56}else if(strncmp(id,"fs",2) == 0){ 57 fp = fopen("fragment.glsl", "r"); 58 shader = glCreateShader(GL_FRAGMENT_SHADER); 59} 60 fseek(fp, 0L, SEEK_END); 61 length = ftell(fp); 62 source = (GLchar *)malloc(length); 63 fseek(fp, 0L, SEEK_SET); 64 ret = fread((void *)source, 1, length, fp) != (size_t)length; 65 fclose(fp); 66 if (ret) 67 fprintf(stderr, "Could not read file:.\n"); 68 else 69 cout<< source <<endl; 70 glShaderSource(shader, 1, &source, &length); 71 free((void *)source); 72 glCompileShader(shader); 73 glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); 74 printShaderInfoLog(shader); 75 if (compiled == GL_FALSE) { 76 fprintf(stderr, "Compile error in vertex shader.\n"); 77 return 0; 78 }else{ 79 return shader; 80 } 81} 82//プログラム作成 83GLuint create_program(GLuint vs, GLuint fs) { 84 const GLuint program = glCreateProgram(); 85 GLint linked; 86 glAttachShader(program, vs); 87 glAttachShader(program, fs); 88 glLinkProgram(program); 89 glGetProgramiv(program, GL_LINK_STATUS, &linked); 90 printProgramInfoLog(program); 91 if (linked == GL_FALSE) { 92 fprintf(stderr, "Link error.\n"); 93 return 0; 94 }else{ 95 glUseProgram(program); 96 return program; 97 } 98} 99//vboに紐付け 100GLuint create_vbo(float data[]) { 101 GLuint vbo; 102 glGenBuffers(1, &vbo); 103 glBindBuffer(GL_ARRAY_BUFFER, vbo); 104 glBufferData(GL_ARRAY_BUFFER,sizeof (GLfloat) *3*3,data, GL_STATIC_DRAW); 105 glBindBuffer(GL_ARRAY_BUFFER,0); 106 return vbo; 107} 108//三角形の頂点 109GLfloat position[] = { 110 0.0, 1.0, 0.0, 111 1.0, 0.0, 0.0, 112 -1.0, 0.0, 0.0 113}; 114//事前処理 115void init(){ 116 const GLuint prg = create_program(create_shader("vs"), create_shader("fs")); 117 GLuint vPosition = create_vbo(position); 118 int vAttLocation = glGetAttribLocation(prg, "position"); 119 glBindBuffer(GL_ARRAY_BUFFER, vPosition); 120 glEnableVertexAttribArray(vAttLocation); 121 glVertexAttribPointer(vAttLocation, 3, GL_FLOAT, false, 0, 0); 122} 123//ループ内処理 124void display(void) 125{ 126 glClearColor(0.0,0.0,0.2,1.0); 127 glClear(GL_COLOR_BUFFER_BIT); 128 glDrawArrays(GL_TRIANGLES, 0,3); 129 glFlush(); 130} 131//メイン 132int main(int argc, const char * argv[]) { 133 GLFWwindow* window; 134 if(!glfwInit()){ 135 return -1; 136 } 137 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 138 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); 139 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 140 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 141 142 window = glfwCreateWindow( 500, 500, "test", NULL, NULL ); 143 if (!window) { 144 glfwTerminate(); 145 return -1; 146 } 147 148 glfwMakeContextCurrent(window); 149 150 int width, height; 151 glfwGetFramebufferSize( window, &width, &height ); 152//事前処理 153 init(); 154//ループ 155 while( !glfwWindowShouldClose( window ) ){ 156 display(); 157 glfwSwapBuffers( window ); 158 glfwPollEvents(); 159 } 160 glfwTerminate(); 161 return 0; 162 163}

glsl

1#version 410 2layout (location=0)in vec3 position; 3void main(void) 4{gl_Position = vec4(position.xy,0.0,1.0);}

glsl

1#version 410 2precision highp float; 3out vec4 outColor; 4void main (void) 5{outColor = vec4(1.0, 1.0, 0.0, 1.0);}

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました????
webGLにおいてはVAOの使用は必須ではないのですが,openGLにおいては必須なのかな....?
とにかくVAOを追加してみたら動きました.よくわかってはないです

投稿2017/09/03 09:46

ukey

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問