2017-03-25 4 views
0

Raspberry PiとOS Xの両方で動作するOpenGL(ES)アプリケーションの開発を開始しました。ラスビアン。この例では、マッピングされたテクスチャを持つ回転キューブを表示します。特定のブロードコム関数を使用してコンテキストを初期化します。 OSXの場合、i'vは適切なGLUT関数を使用しました。私はosx対piのためのinit関数を分割し、piバージョンは正常に動作します。 osxバージョンを実行すると、私は常にredraw_scene()内のglDrawArrays()呼び出しでsegfaultを取得します。通常、これは不正確な頂点データです。しかし、前述したように、同じコードが(設定と描画に関して)Pi上で動作します。これはエラーを示すトリムされたコードのバージョンです。おそらく、私は通常のOpenGL vs ESに対して何か必要なことがありますか?OpenGLはOSXでsegfaultsを実行しますが、Raspberry Piでうまく動作します

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <GLUT/glut.h> 

typedef struct { 
    uint32_t screen_width; 
    uint32_t screen_height; 
    GLuint tex[6]; 
    GLfloat rot_angle_x_inc; 
    GLfloat rot_angle_y_inc; 
    GLfloat rot_angle_z_inc; 
    GLfloat rot_angle_x; 
    GLfloat rot_angle_y; 
    GLfloat rot_angle_z; 
    GLfloat distance; 
    GLfloat distance_inc; 
    char *tex_buf1; 
    char *tex_buf2; 
    char *tex_buf3; 
} CUBE_STATE_T; 

static CUBE_STATE_T _state, *state=&_state; 

#define IMAGE_SIZE 128 

const GLbyte quadx[6*4*3] = { 
    -10, -10, 10, 10, -10, 10, -10, 10, 10, 10, 10, 10, -10, -10, -10, -10, 10, -10, 10, -10, -10, 10, 10, -10, 
    -10, -10, 10, -10, 10, 10, -10, -10, -10, -10, 10, -10, 10, -10, -10, 10, 10, -10, 10, -10, 10, 10, 10, 10, 
    -10, 10, 10, 10, 10, 10, -10, 10, -10, 10, 10, -10, -10, -10, 10, -10, -10, -10, 10, -10, 10, 10, -10, -10 
}; 

const GLfloat texCoords[6 * 4 * 2] = { 
    0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 
    0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 
    0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 0.f, 1.f, 1.f 
}; 

void reshapeView(int width, int height); 
void drawView(); 
void update_model(); 
void redraw_scene(); 

char * junk() { 
    // dont load real images just make some random junk 
    int image_sz = IMAGE_SIZE*IMAGE_SIZE*3; 
    char * texture = (char*)malloc(image_sz); 
    for (int x=0;x<image_sz;x++) { 
     texture[x] = (char)x; 
    } 
    return texture; 
} 

void create() { 
    char * myargv [1]; 
    int myargc = 1; 
    myargv[0] = strdup("view"); 
    glutInit(&myargc, myargv); 

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow("window"); 
    glutFullScreen(); 

    state->tex_buf1 = junk(); 
    state->tex_buf2 = junk(); 
    state->tex_buf3 = junk(); 

    glGenTextures(6, &state->tex[0]); 

    glBindTexture(GL_TEXTURE_2D, state->tex[0]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, 
       GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); 

    glBindTexture(GL_TEXTURE_2D, state->tex[1]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, 
       GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); 

    glBindTexture(GL_TEXTURE_2D, state->tex[2]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, 
       GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); 

    glBindTexture(GL_TEXTURE_2D, state->tex[3]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, 
       GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); 

    glBindTexture(GL_TEXTURE_2D, state->tex[4]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, 
       GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); 

    glBindTexture(GL_TEXTURE_2D, state->tex[5]); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0, 
       GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST); 

    glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glEnable(GL_TEXTURE_2D); 

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glEnable(GL_CULL_FACE); 
    glMatrixMode(GL_MODELVIEW); 

    glutReshapeFunc(reshapeView); 
    glutDisplayFunc(drawView); 
    glutIdleFunc(drawView); 
} 

void reshapeView(int width, int height) { 
    state->screen_width = width; 
    state->screen_height = height; 

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
    glViewport(0, 0, (GLsizei)state->screen_width, (GLsizei)state->screen_height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    float nearp = 1.0f; 
    float farp = 500.0f; 
    float hht = nearp * (float)tan(45.0/2.0/180.0 * 3.141592654); 
    float hwd = hht * (float)state->screen_width/(float)state->screen_height; 

    glFrustum(-hwd, hwd, -hht, hht, nearp, farp); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_BYTE, 0, quadx); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0.f, 0.f, -50.f); 

    state->rot_angle_x = 45.f; 
    state->rot_angle_y = 30.f; 
    state->rot_angle_z = 0.f; 
    state->rot_angle_x_inc = 0.5f; 
    state->rot_angle_y_inc = 0.5f; 
    state->rot_angle_z_inc = 0.f; 
    state->distance = 40.f; 
} 

void drawView() { 
    update_model(); 
    redraw_scene(); 
    glutSwapBuffers(); 
} 

void update_model() { 
    glLoadIdentity(); 
    glTranslatef(0.f, 0.f, -state->distance); 

    glRotatef(state->rot_angle_x, 1.0f, 0.f, 0.f); 
    glRotatef(state->rot_angle_y, 0.f, 1.0f, 0.f); 
    glRotatef(state->rot_angle_z, 0.f, 0.f, 1.0f); 
} 

void redraw_scene() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBindTexture(GL_TEXTURE_2D, state->tex[0]); 
    glRotatef(270.f, 0.f, 0.f, 1.f); // front face normal along z axis 
    // ZOMG segfaults here!!! 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    glBindTexture(GL_TEXTURE_2D, state->tex[1]); 
    glRotatef(90.f, 0.f, 0.f, 1.f); // back face normal along z axis 
    glDrawArrays(GL_TRIANGLE_STRIP, 4, 4); 

    glBindTexture(GL_TEXTURE_2D, state->tex[2]); 
    glRotatef(90.f, 1.f, 0.f, 0.f); // left face normal along x axis 
    glDrawArrays(GL_TRIANGLE_STRIP, 8, 4); 

    glBindTexture(GL_TEXTURE_2D, state->tex[3]); 
    glRotatef(90.f, 1.f, 0.f, 0.f); // right face normal along x axis 
    glDrawArrays(GL_TRIANGLE_STRIP, 12, 4); 

    glBindTexture(GL_TEXTURE_2D, state->tex[4]); 
    glRotatef(270.f, 0.f, 1.f, 0.f); // top face normal along y axis 
    glDrawArrays(GL_TRIANGLE_STRIP, 16, 4); 

    glBindTexture(GL_TEXTURE_2D, state->tex[5]); 
    glRotatef(90.f, 0.f, 1.f, 0.f); // bottom face normal along y axis 
    glDrawArrays(GL_TRIANGLE_STRIP, 20, 4); 
} 

int main() { 
    create(); 
    glutMainLoop(); 
    return 0; 
} 

cmakeのファイル...

cmake_minimum_required(VERSION 3.5) 
project(jni) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -framework OpenGL -framework GLUT -Wno-deprecated -std=c++11") 

set(SOURCE_FILES 
    demo.cpp 
) 

add_executable(demo.bin ${SOURCE_FILES}) 
+0

C++やCを使用していますか?また、どのような標準ですか?コードは間違いなくCのように見えます。 – tambre

+0

申し訳ありませんが、私のコードはC++ですが、私はこの例をcに取り除きました。私はタグを編集します – slipperyseal

+0

segfaultが起こる直前に 'glGetError()'が返すものを見てみてください。 – tambre

答えて

0

あなたは何が悪かったのかを判断するために右のセグメンテーションフォルト前glGetError()の戻り値をチェックする必要があります。 segfaultは、特定の種類のOpenGL操作をサポートしていないドライバまたはグラフィックカードによって引き起こされる可能性があります。

+1

ありがとうございます。私はglGetError()を使って失敗した呼び出しを見つけ出し、OSXがGL_BYTE頂点データをサポートしていないことを発見しました。 (つまり、ESはそうです)私はGL_INTEGERに変更し、うまくいきました。 – slipperyseal

関連する問題