c++ - OpenGL 输出未正确显示使用图像作为纹理

标签 c++ image opengl graphics output

所以我得到了一个图像作为正方形的纹理,但问题是每当我运行代码时我都会得到这个:

enter image description here

但是当我把这条线去掉时:

glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data);

然后我得到这个输出(空白是我想将图像作为纹理放置的地方):

the white polygon

或者,如果我将第三个参数更改为 5,则会得到此输出。但我知道当我运行下面的代码时纹理确实显示正确,但输出仍然像顶部的第一张图像。我将如何着手修复输出,使其看起来像显示纹理的第二张图像?请注意,纹理在我的代码中显示良好,您只是看不到它,因为它被隐藏了,因为整个输出无法正确显示。

#include <GL/glut.h>
#include <iostream>
#include <unistd.h>
#include <math.h>
#include <GL/gl.h>

#include <opencv2/opencv.hpp>   //for OpenCV 3.x  
#include <opencv/highgui.h>     //for OpenCV 3.x  
#include <cstdio>
#include <stdlib.h>
#include <string.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include <math.h>
#define UpperBD 80
#define PI      3.1415926
#define Num_pts 10
using namespace std;
float Xe = 200.0f;//100
float Ye = 300.0f;
float Ze = 450.0f;
float Rho = sqrt(pow(Xe,2) + pow(Ye,2) + pow(Ze,2));
float D_focal = 100.0f; 
GLuint texture[2];

struct Image {

    unsigned long sizeX;
    unsigned long sizeY;
    char *data;
};
typedef struct Image Image;

#define checkImageWidth 64
#define checkImageHeight 64

GLubyte checkImage[checkImageWidth][checkImageHeight][3];
void makeCheckImage(void){

    int i, j, c;
    for (i = 0; i < checkImageWidth; i++) {
        for (j = 0; j < checkImageHeight; j++) {
            c = ((((i&0x8)==0)^((j&0x8)==0)))*255;
            checkImage[i][j][0] = (GLubyte) c;
            checkImage[i][j][1] = (GLubyte) c;
            checkImage[i][j][2] = (GLubyte) c;
        }
    }
}
int ImageLoad(char *filename, Image *image) {

    FILE *file;

    unsigned long size; // size of the image in bytes.
    unsigned long i; // standard counter.
    unsigned short int planes; // number of planes in image (must be 1)
    unsigned short int bpp; // number of bits per pixel (must be 24)

    char temp; // temporary color storage for bgr-rgb conversion.
    // make sure the file is there.

    if ((file = fopen(filename, "rb"))==NULL){
        printf("File Not Found : %s\n",filename);
        return 0;
    }

    // seek through the bmp header, up to the width/height:
    fseek(file, 18, SEEK_CUR);

    // read the width
    if ((i = fread(&image->sizeX, 4, 1, file)) != 1) {
        printf("Error reading width from %s.\n", filename);
        return 0;
    }

    if ((i = fread(&image->sizeY, 4, 1, file)) != 1) {
        printf("Error reading height from %s.\n", filename);
        return 0;
    }

    size = image->sizeX * image->sizeY * 3;
    // read the planes
    if ((fread(&planes, 2, 1, file)) != 1) {
        printf("Error reading planes from %s.\n", filename);
        return 0;
    }
    if (planes != 1) {
        printf("Planes from %s is not 1: %u\n", filename, planes);
        return 0;
    }

    // read the bitsperpixel
    if ((i = fread(&bpp, 2, 1, file)) != 1) {
        printf("Error reading bpp from %s.\n", filename);
        return 0;
    }
    if (bpp != 24) {
        printf("Bpp from %s is not 24: %u\n", filename, bpp);
        return 0;
    }

    // seek past the rest of the bitmap header.
    fseek(file, 24, SEEK_CUR);
    // read the data.
    image->data = (char *) malloc(size);
    if (image->data == NULL) {
        printf("Error allocating memory for color-corrected image data");
        return 0;
    }
    if ((i = fread(image->data, size, 1, file)) != 1) {
        printf("Error reading image data from %s.\n", filename);
        return 0;
    }
    for (i=0;i<size;i+=3) { // reverse all of the colors. (bgr -> rgb)
        temp = image->data[i];
        image->data[i] = image->data[i+2];
        image->data[i+2] = temp;
    }

    // we're done.
    return 1;
}

Image * loadTexture(){

    Image *image1;
    // allocate space for texture
    image1 = (Image *) malloc(sizeof(Image));
    if (image1 == NULL) {
        printf("Error allocating space for image");
        exit(0);
    }

    if (!ImageLoad("g.bmp", image1)) {
        exit(1);
    }
    return image1;
}

void myinit(void)
//something in this function is making it not appear properly
{
    // glClearColor (0.5, 0.5, 0.5, 0.0);
    // glEnable(GL_DEPTH_TEST);
    // glDepthFunc(GL_LESS);

    Image *image1 = loadTexture();
    //  makeCheckImage();

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    // Create Texture
    glGenTextures(2, texture);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //scale linearly when image bigger than texture
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); //scale linearly when image smalled than texture
    glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data);
    //above line causing problem
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    //  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    //  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    //  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    // glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    //  glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth, checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,&checkImage[0][0][0]);
    glEnable(GL_TEXTURE_2D);
    // glShadeModel(GL_FLAT);
}

typedef struct {
    float X[UpperBD];
    float Y[UpperBD];
    float Z[UpperBD];
} pworld;

typedef struct {
    float X[UpperBD];
    float Y[UpperBD];
    float Z[UpperBD];
} pviewer;

typedef struct{
    float X[UpperBD];
    float Y[UpperBD];
} pperspective;

typedef struct{
    float X[UpperBD];
    float Y[UpperBD];
} pattern2DL;

typedef struct{
    float X[UpperBD];
    float Y[UpperBD];
} arrowpoint;

typedef struct {
    float r[UpperBD], g[UpperBD], b[UpperBD];
} pt_diffuse;

void mydisplay()
{
    // define x-y coordinate
    float p1x=-1.0f,  p1y= 0.0f;   
    float p2x= 1.0f,  p2y= 0.0f;
    float p3x= 0.0f,  p3y= 1.0f;
    float p4x= 0.0f,  p4y=-1.0f;

    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    pworld  world;
    pviewer viewer;
    pperspective perspective;
    pattern2DL letterL;
    arrowpoint arrow;

    //define the x-y-z world coordinate
    world.X[0] = 0.0;    world.Y[0] =  0.0;   world.Z[0] =  0.0;    // origin 
    world.X[1] = 50.0;   world.Y[1] =  0.0;   world.Z[1] =  0.0;    // x-axis
    world.X[2] = 0.0;    world.Y[2] =  50.0;  world.Z[2] =  0.0;    // y-axis   
    world.X[3] = 0.0;    world.Y[3] =  0.0;   world.Z[3] =  50.0;   // y-axis

    //define projection plane world coordinate , THIS IS THE SQUARE AROUND THE LETTERS
    world.X[4] = 60.0;   world.Y[4] = -50.0;   world.Z[4] =  0.0;    
    world.X[5] = 60.0;   world.Y[5] =  50.0;   world.Z[5] =  0.0;    // base line
    world.X[7] = 60.0;   world.Y[7] = -50.0;   world.Z[7] = 100.0;   // side bar
    world.X[6] = 60.0;   world.Y[6] =  50.0;   world.Z[6] =  100.0;    // side bar

    //define 2D pattern letter A
    letterL.X[0] = -10.0; letterL.Y[0] = 10.0;    
    letterL.X[1] = -15.0; letterL.Y[1] = 10.0; 
    letterL.X[2] = -20.0; letterL.Y[2] = 30.0;    
    letterL.X[3] = -40.0; letterL.Y[3] = 30.0;
    letterL.X[4] = -45.0; letterL.Y[4] = 10.0;  
    letterL.X[5] = -50.0; letterL.Y[5] = 10.0;
    letterL.X[6] = -37.0; letterL.Y[6] = 70.0;
    letterL.X[7] = -23.0; letterL.Y[7] = 70.0;
    letterL.X[8] = -25.0; letterL.Y[8] = 40.0;
    letterL.X[9] = -35.0; letterL.Y[9] = 40.0;
    letterL.X[10] = -30.0; letterL.Y[10] = 60.0;

    //letter B
    letterL.X[11] = 10.0; letterL.Y[11] = 10.0;    
    letterL.X[12] = 10.0; letterL.Y[12] = 70.0; 
    letterL.X[13] = 20.0; letterL.Y[13] = 10.0;    
    letterL.X[14] = 20.0; letterL.Y[14] = 70.0;

    letterL.X[15] = 20.0; letterL.Y[15] = 60.0;  
    letterL.X[16] = 20.0; letterL.Y[16] = 45.0;
    letterL.X[17] = 20.0; letterL.Y[17] = 35.0;
    letterL.X[18] = 20.0; letterL.Y[18] = 20.0;

    letterL.X[19] = 25.0; letterL.Y[19] = 58.0;
    letterL.X[20] = 27.0; letterL.Y[20] = 56.0;
    letterL.X[21] = 28.0; letterL.Y[21] = 52.0;
    letterL.X[22] = 27.0; letterL.Y[22] = 49.0;
    letterL.X[23] = 25.0; letterL.Y[23] = 47.0;

    letterL.X[24] = 25.0; letterL.Y[24] = 33.0;
    letterL.X[25] = 27.0; letterL.Y[25] = 31.0;
    letterL.X[26] = 28.0; letterL.Y[26] = 27.0;
    letterL.X[27] = 27.0; letterL.Y[27] = 24.0;
    letterL.X[28] = 25.0; letterL.Y[28] = 22.0;

    letterL.X[29] = 30.0; letterL.Y[29] = 65.0;
    letterL.X[30] = 34.0; letterL.Y[30] = 60.0;
    letterL.X[31] = 34.0; letterL.Y[31] = 50.0;
    letterL.X[32] = 30.0; letterL.Y[32] = 45.0;

    letterL.X[33] = 25.0; letterL.Y[33] = 40.0;

    letterL.X[34] = 30.0; letterL.Y[34] = 38.0;
    letterL.X[35] = 34.0; letterL.Y[35] = 30.0;
    letterL.X[36] = 34.0; letterL.Y[36] = 20.0;
    letterL.X[37] = 30.0; letterL.Y[37] = 15.0;

    arrow.X[0] = 0.0; arrow.Y[0] = 25.0;    
    arrow.X[1] = 0.0; arrow.Y[1] = 75.0; 
    arrow.X[2] = 60.0; arrow.Y[2] = 75.0;    
    arrow.X[3] = 60.0; arrow.Y[3] = 85.0;
    arrow.X[4] = 90.0; arrow.Y[4] = 50.0;  
    arrow.X[5] = 60.0; arrow.Y[5] = 15.0;
    arrow.X[6] = 60.0; arrow.Y[6] = 25.0;

    arrow.X[7] = 0.0; arrow.Y[7] = 25.0;    
    arrow.X[8] = 0.0; arrow.Y[8] = 75.0; 
    arrow.X[9] = 60.0; arrow.Y[9] = 75.0;    
    arrow.X[10] = 60.0; arrow.Y[10] = 85.0;
    arrow.X[11] = 90.0; arrow.Y[11] = 50.0;  
    arrow.X[12] = 60.0; arrow.Y[12] = 15.0;
    arrow.X[13] = 60.0; arrow.Y[13] = 25.0;

    //decoration
    for(int i = 0; i <= 37; i++)
    {
      world.X[8+i] = 60.0;
      world.Y[8+i] = letterL.X[i];
      world.Z[8+i] = letterL.Y[i];
    }
    //arrow
    for(int j = 0; j <= 6; j++)
    {
      world.X[46+j] = arrow.X[j]-50;//-50
      world.Y[46+j] = arrow.Y[j];
      world.Z[46+j] = 100.0;//CHANGE TO 150?
    }
    for(int k = 0; k <= 6; k++)
    {
      world.X[53+k] = arrow.X[k]-50;
      world.Y[53+k] = arrow.Y[k];
      world.Z[53+k] = 110.0;//CHANGE TO 150?
    }

    float sPheta = Ye / sqrt(pow(Xe,2) + pow(Ye,2));
    float cPheta = Xe / sqrt(pow(Xe,2) + pow(Ye,2));
    float sPhi = sqrt(pow(Xe,2) + pow(Ye,2)) / Rho;
    float cPhi = Ze / Rho;

    float xMin = 1000.0, xMax = -1000.0;
    float yMin = 1000.0, yMax = -1000.0;
    //47 is normal vector 46 is a, 45 is ps, 7 is top left box vertex
    //COMUTER SHADE OF FLOATING ARROW DUE NEXT WEEK

    world.X[60] = -200.0;   world.Y[60]=50.0;   world.Z[60]=200.0;//ps
    world.X[61] = 0.0;   world.Y[61]=0.0;   world.Z[61]=0.0;//vector a
    world.X[62] = 0.0;   world.Y[62]=0.0;   world.Z[62]=1.0;//VECTOR N

    float tmp = (world.X[62]*(world.X[61]-world.X[60]))
                +(world.Y[62]*(world.Y[61]-world.Y[60]))
                +(world.Z[62]*(world.Z[61]-world.Z[60]));
                cout << tmp;
    float lambda =  tmp/((world.X[62]*(world.X[60]-world.X[7]))
                +(world.Y[62]*(world.Y[60]-world.Y[7]))
                +(world.Z[62]*(world.Z[60]-world.Z[7])));
                cout << lambda;
    float lambda_2 = tmp/((world.X[62]*(world.X[60]-world.X[6]))//MAKE ARROW HIGHER, ABOVE PROJECTION PLANE SQUARE
                +(world.Y[62]*(world.Y[60]-world.Y[6]))
                +(world.Z[62]*(world.Z[60]-world.Z[6])));
                cout << lambda_2;
    world.X[63] = world.X[60]+lambda*(world.X[60]-world.X[7]);//interseciton point for p7, X COMP
    world.Y[63] = world.Y[60]+lambda*(world.Y[60]-world.Y[7]);//Y COMP
    world.Z[63] = 0.0;

    world.X[64] = world.X[60]+lambda_2*(world.X[60]-world.X[6]);//interseciton point for p7, X COMP
    world.Y[64] = world.Y[60]+lambda_2*(world.Y[60]-world.Y[6]);//Y COMP
    world.Z[64] = 0.0;


    //for arrow's shade, 46-52
    float lambda_arrow1 =  tmp/((world.X[62]*(world.X[60]-world.X[46]))
                +(world.Y[62]*(world.Y[60]-world.Y[46]))
                +(world.Z[62]*(world.Z[60]-world.Z[46])));

    float lambda_arrow2 = tmp/((world.X[62]*(world.X[60]-world.X[47]))//MAKE ARROW HIGHER, ABOVE PROJECTION PLANE SQUARE
                +(world.Y[62]*(world.Y[60]-world.Y[47]))
                +(world.Z[62]*(world.Z[60]-world.Z[47])));

    float lambda_arrow3 =  tmp/((world.X[62]*(world.X[60]-world.X[48]))
                            +(world.Y[62]*(world.Y[60]-world.Y[48]))
                            +(world.Z[62]*(world.Z[60]-world.Z[48])));

    float lambda_arrow4 =  tmp/((world.X[62]*(world.X[60]-world.X[49]))
                +(world.Y[62]*(world.Y[60]-world.Y[49]))
                +(world.Z[62]*(world.Z[60]-world.Z[49])));

    float lambda_arrow5 =  tmp/((world.X[62]*(world.X[60]-world.X[50]))
                +(world.Y[62]*(world.Y[60]-world.Y[50]))
                +(world.Z[62]*(world.Z[60]-world.Z[50])));

    float lambda_arrow6 =  tmp/((world.X[62]*(world.X[60]-world.X[51]))
                +(world.Y[62]*(world.Y[60]-world.Y[51]))
                +(world.Z[62]*(world.Z[60]-world.Z[51])));

    float lambda_arrow7 =  tmp/((world.X[62]*(world.X[60]-world.X[52]))
                +(world.Y[62]*(world.Y[60]-world.Y[52]))
                +(world.Z[62]*(world.Z[60]-world.Z[52])));

    world.X[65] = world.X[60]+lambda_arrow1*(world.X[60]-world.X[46]);//interseciton point for p7, X COMP
    world.Y[65] = world.Y[60]+lambda_arrow1*(world.Y[60]-world.Y[46]);//Y COMP
    world.Z[65] = 0.0;

    world.X[66] = world.X[60]+lambda_arrow2*(world.X[60]-world.X[47]);//interseciton point for p7, X COMP
    world.Y[66] = world.Y[60]+lambda_arrow2*(world.Y[60]-world.Y[47]);//Y COMP
    world.Z[66] = 0.0;

    world.X[67] = world.X[60]+lambda_arrow3*(world.X[60]-world.X[48]);//interseciton point for p7, X COMP
    world.Y[67] = world.Y[60]+lambda_arrow3*(world.Y[60]-world.Y[48]);//Y COMP
    world.Z[67] = 0.0;

    world.X[68] = world.X[60]+lambda_arrow4*(world.X[60]-world.X[49]);//interseciton point for p7, X COMP
    world.Y[68] = world.Y[60]+lambda_arrow4*(world.Y[60]-world.Y[49]);//Y COMP
    world.Z[68] = 0.0;

    world.X[69] = world.X[60]+lambda_arrow5*(world.X[60]-world.X[50]);//interseciton point for p7, X COMP
    world.Y[69] = world.Y[60]+lambda_arrow5*(world.Y[60]-world.Y[50]);//Y COMP
    world.Z[69] = 0.0;

    world.X[70] = world.X[60]+lambda_arrow6*(world.X[60]-world.X[51]);//interseciton point for p7, X COMP
    world.Y[70] = world.Y[60]+lambda_arrow6*(world.Y[60]-world.Y[51]);//Y COMP
    world.Z[70] = 0.0;

    world.X[71] = world.X[60]+lambda_arrow7*(world.X[60]-world.X[52]);//interseciton point for p7, X COMP
    world.Y[71] = world.Y[60]+lambda_arrow7*(world.Y[60]-world.Y[52]);//Y COMP
    world.Z[71] = 0.0;

  // -----------diffuse reflection-----------*
    pt_diffuse  diffuse;   //diffuse.r[3]

    //-------reflectivity coefficient-----------* 
    #define     Kdr     0.8
    #define     Kdg     0.0
    #define     Kdb     0.0

    // define additional pts to find diffuse reflection
    //world.X[49] = world.X[45] + lambda_2*(world.X[45] - world.X[6]);

    //--------compute distance------------------*//change 45 to 60!!!!!!
    float distance[UpperBD];
    for (int i=63; i<=71; i++) {
        distance[i] = sqrt(pow((world.X[i]-world.X[60]),2)+         //intersect pt p7
                            pow((world.Y[i]-world.Y[60]),2)+
                            pow((world.X[i]-world.X[60]),2) );
        //std::cout << "distance[i]  " << distance[i] << std::endl;
    } 

//    for (int i=4; i<=5; i++){
//    distance[i] = sqrt(pow((world.X[i]-world.X[60]),2)+         //pt p4 of projection plane
//                        pow((world.Y[i]-world.Y[60]),2)+
//                        pow((world.X[i]-world.X[60]),2) );
//    //std::cout << "distance[i]  " << distance[i] << std::endl;
//    }


    //--------compute angle---------------------*
    float angle[UpperBD], tmp_dotProd[UpperBD], tmp_mag_dotProd[UpperBD]; 

    for (int i=63; i<=71; i++){

        tmp_dotProd[i] = world.Z[i]-world.X[60]; 
        std::cout << " tmp_dotProd[i]  " <<  tmp_dotProd[i] << std::endl;

        tmp_mag_dotProd[i] = sqrt(pow((world.X[i]-world.X[60]),2)+         //[45] pt light source 
                            pow((world.Y[i]-world.Y[60]),2)+
                            pow((world.Z[i]-world.Z[60]),2) );
        std::cout << " tmp_mag_dotProd[i]  1 " <<  tmp_mag_dotProd[i] << std::endl;

        angle[i] = tmp_dotProd[i]/ tmp_mag_dotProd[i]; 
        std::cout << "angle[i]  " << angle[i] << std::endl;

        //compute color intensity
        diffuse.r[i] = Kdr *  angle[i] /  pow(distance[i],2) ;
        diffuse.g[i] = Kdg *  angle[i] /  pow(distance[i],2) ;
        diffuse.b[i] = Kdb *  angle[i] /  pow(distance[i],2) ;
    }

//   for (int i=4; i<=5; i++){
//
//    tmp_dotProd[i] = world.Z[i]-world.X[45]; 
//    std::cout << " tmp_dotProd[i]  " <<  tmp_dotProd[i] << std::endl;
//
//    tmp_mag_dotProd[i] = sqrt(pow((world.X[i]-world.X[45]),2)+         //[45] pt light source 
//                        pow((world.Y[i]-world.Y[45]),2)+
//                        pow((world.Z[i]-world.Z[45]),2) );
//    std::cout << " tmp_mag_dotProd[i]  1 " <<  tmp_mag_dotProd[i] << std::endl;
//
//    angle[i] = tmp_dotProd[i]/ tmp_mag_dotProd[i]; 
//    std::cout << "angle[i]  " << angle[i] << std::endl;
//
//    //compute color intensity
//    diffuse.r[i] = Kdr *  angle[i] /  pow(distance[i],2) ;
//    diffuse.g[i] = Kdg *  angle[i] /  pow(distance[i],2) ;
//    diffuse.b[i] = Kdb *  angle[i] /  pow(distance[i],2) ;
//
//    //std::cout << "diffuse.r[i]  " << diffuse.r[i] << std::endl;
//    //std::cout << "diffuse.g[i]  " << diffuse.g[i] << std::endl;
//    }
//
    for(int i = 0; i < UpperBD; i++)
    {
      viewer.X[i] = -sPheta * world.X[i] + cPheta * world.Y[i];
      viewer.Y[i] = -cPheta * cPhi * world.X[i] 
               - cPhi * sPheta * world.Y[i]
               + sPhi * world.Z[i];
      viewer.Z[i] = -sPhi * cPheta * world.X[i]
               - sPhi * cPheta * world.Y[i]
               -cPheta * world.Z[i] + Rho;
              // cout << i;
    }

    for(int i = 0; i <= UpperBD; i++)
    {
        perspective.X[i] = D_focal * viewer.X[i] / viewer.Z[i] ;
        perspective.Y[i] = D_focal * viewer.Y[i] / viewer.Z[i] ;
        if (perspective.X[i] > xMax) xMax = perspective.X[i];
        if (perspective.X[i] < xMin) xMin = perspective.X[i];
        if (perspective.Y[i] > yMax) yMax = perspective.Y[i];
        if (perspective.Y[i] < yMin) yMin = perspective.Y[i]; 
      /////*
      //std::cout << "xMin " << xMin << std::endl;
      //  std::cout << "xMax " << xMax << std::endl;
      //  std::cout << "yMin " << yMin << std::endl;
      //  std::cout << "yMax " << yMax << std::endl;
      //*/
    }
    for(int i = 0; i <= UpperBD; i++)
    {
        if ((xMax-xMin) != 0) perspective.X[i] = perspective.X[i]/(xMax-xMin);
        if ((yMax-yMin) != 0) perspective.Y[i] = perspective.Y[i]/(yMax-yMin);
        std::cout << i << perspective.X[i] << perspective.Y[i] << std::endl;
    }
    glViewport(0,0,1550,1250);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();


    glBegin(GL_LINES);

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    glVertex2f(perspective.X[0],perspective.Y[0]); 
    glVertex2f(perspective.X[1],perspective.Y[1]);
    glColor3f(0.0, 1.0, 0.0);
    glVertex2f(perspective.X[0],perspective.Y[0]); 
    glVertex2f(perspective.X[2],perspective.Y[2]);
    glColor3f(0.0, 0.0, 1.0);
    glVertex2f(perspective.X[0],perspective.Y[0]); 
    glVertex2f(perspective.X[3],perspective.Y[3]);

    glColor3f(1.0, 1.0, 0.0);  // projection plane , square
    glVertex2f(perspective.X[4],perspective.Y[4]); 
    glVertex2f(perspective.X[5],perspective.Y[5]);
    glVertex2f(perspective.X[4],perspective.Y[4]); 
    glVertex2f(perspective.X[7],perspective.Y[7]);
    glVertex2f(perspective.X[5],perspective.Y[5]); 
    glVertex2f(perspective.X[6],perspective.Y[6]);
    glVertex2f(perspective.X[6],perspective.Y[6]); 
    glVertex2f(perspective.X[7],perspective.Y[7]);
    glEnd();

    glColor3f(0.0, 1.0, 0.0);  // LETTER A STARTS HERE
    glBegin(GL_POLYGON);
    glVertex2f(perspective.X[13],perspective.Y[13]);
    glVertex2f(perspective.X[12],perspective.Y[12]);

    glVertex2f(perspective.X[11],perspective.Y[11]);
    glVertex2f(perspective.X[12],perspective.Y[12]);

    glVertex2f(perspective.X[14],perspective.Y[14]);
    glVertex2f(perspective.X[13],perspective.Y[13]);

    glVertex2f(perspective.X[18],perspective.Y[18]);
    glVertex2f(perspective.X[17],perspective.Y[17]);

    glVertex2f(perspective.X[11],perspective.Y[11]);
    glVertex2f(perspective.X[17],perspective.Y[17]);

    glVertex2f(perspective.X[18],perspective.Y[18]);
    glVertex2f(perspective.X[14],perspective.Y[14]);

    glEnd();
    glColor3f(0.0, 1.0, 0.0); 
    glBegin(GL_POLYGON);

    glVertex2f(perspective.X[8],perspective.Y[8]);
    glVertex2f(perspective.X[15],perspective.Y[15]);

    glVertex2f(perspective.X[14],perspective.Y[14]);
    glVertex2f(perspective.X[15],perspective.Y[15]);

    glVertex2f(perspective.X[14],perspective.Y[14]);
    glVertex2f(perspective.X[18],perspective.Y[18]);

    glVertex2f(perspective.X[16],perspective.Y[16]);
    glVertex2f(perspective.X[18],perspective.Y[18]);

    glVertex2f(perspective.X[16],perspective.Y[16]);
    glVertex2f(perspective.X[10],perspective.Y[10]);

    glVertex2f(perspective.X[9],perspective.Y[9]);
    glVertex2f(perspective.X[10],perspective.Y[10]);

    glVertex2f(perspective.X[8],perspective.Y[8]);
    glVertex2f(perspective.X[9],perspective.Y[9]);


    glEnd();
    glColor3f(0.0, 1.0, 0.0); 
    glBegin(GL_POLYGON);

    glVertex2f(perspective.X[16],perspective.Y[16]);
    glVertex2f(perspective.X[17],perspective.Y[17]);
    //etc...


    glEnd();
    glColor3f(0.0, 1.0, 0.0);  //LETTER B STARTS HERE
    glBegin(GL_POLYGON);

    glVertex2f(perspective.X[19],perspective.Y[19]);
    glVertex2f(perspective.X[20],perspective.Y[20]);

    //etc...

    glEnd();
    glColor3f(0.0, 1.0, 0.0);
    glBegin(GL_LINES);
    //     
    glVertex2f(perspective.X[23],perspective.Y[23]);
    glVertex2f(perspective.X[24],perspective.Y[24]);

    glVertex2f(perspective.X[25],perspective.Y[25]);
    glVertex2f(perspective.X[26],perspective.Y[26]);

    glEnd();
    glColor3f(0.0, 1.0, 0.0); 
    glBegin(GL_POLYGON);

    glVertex2f(perspective.X[27],perspective.Y[27]);
    glVertex2f(perspective.X[28],perspective.Y[28]);

    //etc...

    glEnd();
    glColor3f(0.0, 1.0, 0.0); 
    glBegin(GL_POLYGON);

    glVertex2f(perspective.X[29],perspective.Y[29]);
    glVertex2f(perspective.X[30],perspective.Y[30]);
    //etc...

    glEnd();
    glColor3f(0.0, 1.0, 0.0); 
    glBegin(GL_POLYGON);

    glVertex2f(perspective.X[24],perspective.Y[24]);
    glVertex2f(perspective.X[41],perspective.Y[41]);

    //etc...

    glEnd();
    glColor3f(0.0, 1.0, 0.0);


    glColor3f(1.0, 0.0, 0.0);
    glBegin(GL_LINES);//3D arrow starts here

    glVertex2f(perspective.X[46],perspective.Y[46]);
    glVertex2f(perspective.X[47],perspective.Y[47]);

    //etc...

    glEnd();    //end arrow

    glColor3f(1.0, 1.0, 0.0);
    glBegin(GL_LINES);

    glVertex2f(perspective.X[63],perspective.Y[63]);
    glVertex2f(perspective.X[64],perspective.Y[64]);
    //etc...

    glEnd();    //end arrow

    glColor3f(1.0, 0.0, 0.0);
    glBegin(GL_LINES);
    //arrow shadow

    glVertex2f(perspective.X[65],perspective.Y[65]);
    glVertex2f(perspective.X[66],perspective.Y[66]);
    //etc...

    glEnd();

    glBindTexture(GL_TEXTURE_2D, texture[1]);

    //  glutSolidTeapot(0.1);

    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glEnable( GL_TEXTURE_2D );
    glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
    glBegin(GL_QUADS);
    glVertex2f(perspective.X[4],perspective.Y[4]); 
    glTexCoord2f(0.0, 0.0);
    glVertex2f(perspective.X[5],perspective.Y[5]);
    glTexCoord2f(0.1, 0.0);
    glVertex2f(perspective.X[4],perspective.Y[4]); 
    glTexCoord2f(0.1, 0.1);
    glVertex2f(perspective.X[7],perspective.Y[7]);
    glTexCoord2f(0.0, 0.1);
    glVertex2f(perspective.X[5],perspective.Y[5]); 
    glVertex2f(perspective.X[6],perspective.Y[6]);
    glVertex2f(perspective.X[6],perspective.Y[6]); 
    glVertex2f(perspective.X[7],perspective.Y[7]);
    glEnd();

    glDisable( GL_TEXTURE_2D );

    //glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    #define     display_scaling        200000.0
    #define     display_shifting    0.2
    for (int i=63; i<=71; i++) {
        float r, g, b;
        r = display_scaling*diffuse.r[i]+display_shifting;
        //r = display_scaling*diffuse.r[i];
        g = diffuse.g[i]; b = diffuse.b[i] ;
        glColor3f(r, g, b);
        std::cout << "display_scaling*diffuse.r[i]  " << r << std::endl;
        glBegin(GL_POLYGON);
        glVertex2f(perspective.X[i],perspective.Y[i]);
        glVertex2f(perspective.X[i]+0.1,perspective.Y[i]);
        glVertex2f(perspective.X[i]+0.1,perspective.Y[i]+0.1);
        glVertex2f(perspective.X[i],perspective.Y[i]+0.1);
        glEnd();
    }

    gluPerspective(45.0,0.5,1.0,60.0);
    gluOrtho2D(5, 10, 0.0, 10);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glutSwapBuffers();
    glFlush();
    //sleep(5);
}

int main(int argc, char** argv)
{
    cv::Mat image = cv::imread("b.jpg", CV_LOAD_IMAGE_COLOR);
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize(900, 1000);
    glutCreateWindow("lab");

    //imshow( "lab", image );  
    glutDisplayFunc(mydisplay);
    myinit();
    glutMainLoop();
}

最佳答案

glEnable(GL_TEXTURE_2D)必须从 myinit 中删除,因为它是在绘制具有纹理的对象之前立即完成的。
进一步使用 STB library ,可在 GitHub - nothings/stb 找到加载位图:

#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>

void myinit(void)
{
      glGenTextures(2, texture);

      int cx, cy, ch;
      stbi_uc *img = stbi_load("g.bmp", &cx, &cy, &ch, 3);
      if (!img)
        return;

      glPixelStorei(GL_UNPACK_ALIGNMENT, 1);     
      glBindTexture(GL_TEXTURE_2D, texture[0]);
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
      glTexImage2D(GL_TEXTURE_2D, 0, 3, cx, cy, 0, GL_RGB, GL_UNSIGNED_BYTE, img);
      stbi_image_free( img );

      // ....
}

顶点坐标数为UpperBD , 所以最大索引是 UpperBD-1< UpperBD , 但不是 <= UpperBD .

变化(2次):

for(int i = 0; i <= UpperBD; i++)
for(int i = 0; i < UpperBD; i++)


gluPerspectivegluOrtho2D一下子完全没有意义。

mydisplay中每帧开始时初始化投影矩阵和模型 View 矩阵:

void mydisplay()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0,0.5,1.0,60.0);
    //gluOrtho2D(5, 10, 0.0, 10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClear(GL_COLOR_BUFFER_BIT);

    .....
}

当顶点坐标由 glVertex 设置时当前纹理坐标,并与顶点坐标相关联。这意味着 glTexCoord 必须先用餐 glVertex . GL_QUAD 图元由 4 个顶点组成,每个顶点坐标需要自己的纹理坐标:

glBindTexture(GL_TEXTURE_2D, texture[0]);
glEnable( GL_TEXTURE_2D );
glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex2f(perspective.X[4],perspective.Y[4]);
glTexCoord2f(1.0, 0.0);
glVertex2f(perspective.X[5],perspective.Y[5]);
glTexCoord2f(1.0, 1.0);
glVertex2f(perspective.X[6],perspective.Y[6]);
glTexCoord2f(0.0, 1.0);
glVertex2f(perspective.X[7],perspective.Y[7]);
glEnd();

关于c++ - OpenGL 输出未正确显示使用图像作为纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53799616/

相关文章:

qt - 如何使用QSGSimpleTextureNode?

html - 如何使图像保留在 css 网格容器的行中?

c++ - 使用 Win32 C++ 检测文件句柄泄漏

c++ - 这个 for 循环语句的正确语法

c++ - 在 Linux 中记录和绘制引导过程信息

image - 如何使用边界分割具有多部分/相关MIME类型的电子邮件?

php - 在文件系统上高效存储用户上传的图像

c++ - 在GLSL着色器中采样类型GL_UNSIGNED_SHORT的GL_DEPTH_COMPONENTs

c++ - 在 Ubuntu 上使用 GLFW 设置 OpenGL NetBeans 项目

c++ - NVidia推力device_vector的字符串