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

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

ただいまの
回答率

90.00%

c++でGLSLが動かない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,233

ukey

score 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
で通してみています

#include <iostream>
#include <string>
#include <OpenGL/gl.h>
#include <OpenGL/glext.h>
#include <GLFW/glfw3.h>

using namespace std;

//シェーダ読み込み時のデバッグ
void printShaderInfoLog(GLuint shader)
{
  GLsizei bufSize;
  glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &bufSize);
  if (bufSize > 1) {
    GLchar *infoLog;
    infoLog = (GLchar *)malloc(bufSize);
    if (infoLog != NULL) {
      GLsizei length;
      glGetShaderInfoLog(shader, bufSize, &length, infoLog);
      fprintf(stderr, "InfoLog:\n%s\n\n", infoLog);
      free(infoLog);
    }
    else
      fprintf(stderr, "Could not allocate InfoLog buffer.\n");
  }
}
//プログラム作成時のデバッグ
void printProgramInfoLog(GLuint program)
{
  GLsizei bufSize;
  glGetProgramiv(program, GL_INFO_LOG_LENGTH , &bufSize);
  if (bufSize > 1) {
    GLchar *infoLog;
    infoLog = (GLchar *)malloc(bufSize);
    if (infoLog != NULL) {
      GLsizei length;
      glGetProgramInfoLog(program, bufSize, &length, infoLog);
      fprintf(stderr, "InfoLog:\n%s\n\n", infoLog);
      free(infoLog);
    }
    else
      fprintf(stderr, "Could not allocate InfoLog buffer.\n");
  }
}
//シェーダ読み込み
GLuint create_shader(const char* id) {
    GLuint shader;
    GLint compiled;
    FILE *fp;
    const GLchar *source;
    GLsizei length;
    int ret;
if(strncmp(id,"vs",2) == 0){
    fp = fopen("vertex.glsl", "r");
    shader = glCreateShader(GL_VERTEX_SHADER);
}else if(strncmp(id,"fs",2) == 0){
    fp = fopen("fragment.glsl", "r");
    shader = glCreateShader(GL_FRAGMENT_SHADER);
}
    fseek(fp, 0L, SEEK_END);
    length = ftell(fp);
    source = (GLchar *)malloc(length);
    fseek(fp, 0L, SEEK_SET);
    ret = fread((void *)source, 1, length, fp) != (size_t)length;
    fclose(fp);
    if (ret)
      fprintf(stderr, "Could not read file:.\n");
    else
    cout<< source <<endl;
      glShaderSource(shader, 1, &source, &length);
    free((void *)source);
    glCompileShader(shader);
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
    printShaderInfoLog(shader);
    if (compiled == GL_FALSE) {
      fprintf(stderr, "Compile error in vertex shader.\n");
      return 0;
    }else{
        return shader;
    }
}
//プログラム作成
GLuint create_program(GLuint vs, GLuint fs) {
    const GLuint program = glCreateProgram();
    GLint linked;
    glAttachShader(program, vs);
    glAttachShader(program, fs);
    glLinkProgram(program);
    glGetProgramiv(program, GL_LINK_STATUS, &linked);
    printProgramInfoLog(program);
    if (linked == GL_FALSE) {
      fprintf(stderr, "Link error.\n");
      return 0;
    }else{
        glUseProgram(program);
        return program;
    }
}
//vboに紐付け
GLuint create_vbo(float data[]) {
    GLuint vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER,sizeof (GLfloat) *3*3,data, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER,0);
    return vbo;
}
//三角形の頂点
GLfloat position[] = {
    0.0, 1.0, 0.0,
    1.0, 0.0, 0.0,
   -1.0, 0.0, 0.0
};
//事前処理
void init(){
   const GLuint prg = create_program(create_shader("vs"), create_shader("fs"));
   GLuint vPosition = create_vbo(position);
   int vAttLocation = glGetAttribLocation(prg, "position");
   glBindBuffer(GL_ARRAY_BUFFER, vPosition);
   glEnableVertexAttribArray(vAttLocation);
   glVertexAttribPointer(vAttLocation, 3, GL_FLOAT, false, 0, 0);
}
//ループ内処理
void display(void)
{
    glClearColor(0.0,0.0,0.2,1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLES, 0,3);
    glFlush();
}
//メイン
int main(int argc, const char * argv[]) {
    GLFWwindow* window;
    if(!glfwInit()){
        return -1;
    }
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

    window = glfwCreateWindow( 500, 500, "test", NULL, NULL );
    if (!window) {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);

    int width, height;
    glfwGetFramebufferSize( window, &width, &height );
//事前処理
    init();
//ループ
    while( !glfwWindowShouldClose( window ) ){
        display();
        glfwSwapBuffers( window );
        glfwPollEvents();
    }
    glfwTerminate();
    return 0;

}
#version 410
layout (location=0)in vec3 position;
void main(void)
{gl_Position = vec4(position.xy,0.0,1.0);}
#version 410
precision highp float;
out vec4  outColor;
void main (void)
{outColor = vec4(1.0, 1.0, 0.0, 1.0);}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る