2016-07-26 4 views
0

Android에서 OpenGL ES 3.0 코드로 OpenGL 코드를 이식하려고합니다. 그러나 "glTexImage1D"및 "GL_TEXTURE_1D"함수는 OpenGL ES 2.0 사양에 정의되어 있지 않습니다. 그것에 대한 대안이 있습니까?OpenGL es 3.0에서 glTexImage1D를위한 대체물?

내 Android 휴대 전화는 16 개의 텍스처 단위를 지원하며 개인용 컴퓨터에서 GLSL 셰이더를 구현하려면 1D 텍스처를 통해 루프 업해야합니다.

따라서 가장 가능한 방법은 "glTexImage2D"및 "GL_TEXTURE_2D"로 대체하는 것입니다.

#include <GL/glut.h> 

GLuint tex = 0; 
void init() 
{ 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_1D, tex); 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    // 
    unsigned char buf[32 * 4]; 
    for (size_t i = 0; i < sizeof(buf); i += 4) 
    { 
     buf[i + 0] = rand() % 255; 
     buf[i + 1] = rand() % 255; 
     buf[i + 2] = rand() % 255; 
     buf[i + 3] = 255; 
    } 
    glTexImage1D(GL_TEXTURE_1D, 0, 4, sizeof(buf)/4, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf); 
} 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-2, 2, -2, 2, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glEnable(GL_TEXTURE_1D); 
    glBindTexture(GL_TEXTURE_1D, tex); 
    glColor3ub(255, 255, 255); 

    glLineWidth(10); 
    glBegin(GL_LINES); 
    glTexCoord1i(0); 
    glVertex2i(-1, -1); 
    glTexCoord1i(1); 
    glVertex2i(1, 1); 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    init(); 
    glutMainLoop(); 
    return 0; 
} 

답변

0

감사의 높이 Texture2D 및 2D 텍스처를 사용

#include <GL/glut.h> 

GLuint tex = 0; 
void init() 
{ 
unsigned char buf[ 32 * 4]; 
    for (size_t i = 0; i < sizeof(buf); i += 4) 
    { 
      buf[ i + 0] = rand() % 255; 
      buf[ i + 1] = rand() % 255; 
      buf[ i + 2] = rand() % 255; 
      buf[ i + 3] = 255; 
    } 


    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // 4 or 8 
    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_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf); 


} 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-2, 2, -2, 2, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    /* 
    glEnable(GL_TEXTURE_1D); 
    glBindTexture(GL_TEXTURE_1D, tex); 
    */ 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, tex); 


    glColor3ub(255, 255, 255); 

    glLineWidth(10); 
    glBegin(GL_LINES); 
    glTexCoord1i(0); 
    glVertex2i(-1, -1); 
    glTexCoord1i(1); 
    glVertex2i(1, 1); 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    init(); 
    glutMainLoop(); 
    return 0; 
}