C++, OpenGL, SDL2 - Не правильно рисуеться часть текстуры!
Хочу нариосвать часть текстуры на языке OpenGL, но она не правильно рисуеться!
Код:
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
#include <SDL2/SDL_image.h>
#include <string>
using namespace std;
SDL_Window *window;
SDL_Event event;
GLuint *textures;
SDL_Surface *texture;
long double xx=0, yy=0, widthw=1, heighth=1;
void setTextureCount(int count){
textures=new GLuint[count];
glGenTextures(count, textures);
}
int currentTexture=0, id=0, mode=0;
void loadTexture(std::string path){
texture=IMG_Load(path.c_str());
if(texture->format->Amask)
mode=GL_RGBA;
else
mode=GL_RGB;
id=currentTexture;
glBindTexture(GL_TEXTURE_2D, textures[currentTexture]);
currentTexture++;
glTexImage2D(GL_TEXTURE_2D, 0, mode, texture->w, texture->h,
0, mode, GL_UNSIGNED_BYTE, texture->pixels);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
void setTextureRect(int x, int y,
int width, int height){
long double test1=x, test2=y, test3=width, test4=height;
if((long double)x!=0)
xx=(long double)test1/texture->w;
if((long double)y!=0)
yy=(long double)test2/texture->h;
widthw=(long double)(test3/texture->w)+xx;
heighth=(long double)(test4/texture->h)+yy;
}
void displayTexture(){
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTranslatef(0, 0, 0);
glBindTexture(GL_TEXTURE_2D, textures[id]);
glBegin(GL_QUADS);
glColor3f(255, 255, 255);
glTexCoord2d(xx, yy); glVertex2f(0, 0);
glTexCoord2d(widthw, yy); glVertex2f(texture->w, 0);
glTexCoord2d(widthw, heighth); glVertex2f(texture->w, texture->h);
glTexCoord2d(xx, heighth); glVertex2f(0, texture->h);
glEnd();
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
}
int main(){
window=SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, 800, 800, SDL_WINDOW_OPENGL);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GLContext context=SDL_GL_CreateContext(window);
SDL_GL_SetSwapInterval(SDL_FALSE);
setTextureCount(0);
loadTexture("unnamed.jpg");
setTextureRect(9, 12, 63, 77);
while(window!=NULL){
while(SDL_PollEvent(&event)){
if(event.type==SDL_QUIT)
window=NULL;
if(event.key.keysym.scancode==SDL_SCANCODE_ESCAPE)
window=NULL;
}
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 800, 800, 0, -10, 10);
displayTexture();
SDL_GL_SwapWindow(window);
}
}
Не правильное:
Правильное:
Как нарисовать часть текстуры правильно?
Ответы (1 шт):
исправь для начала:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
на:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
чтобы было:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
и потом, чтобы отобразить текстуру на квадрате, не обязательно знать размер текстуры, напиши так:
glBegin(GL_QUADS);
glColor3f(255, 255, 255);
glTexCoord2d(0.0, 0.0); glVertex2f(0, 0);
glTexCoord2d(1.0, 0.0); glVertex2f(texture->w, 0);
glTexCoord2d(1.0, 1.0); glVertex2f(texture->w, texture->h);
glTexCoord2d(0.0, 1.0); glVertex2f(0, texture->h);
glEnd();
возможно, ты неправильно вводил текстурные кординаты,
и еще функции glColor3f, glVertex2f и glTexCoord2d используют разные входные типы переменных, например: glColor3f - float, glColor3d - double, glColor3i - int, и glVertex2f, glTexCoord2f соответственно,
а значения текстурных кординат надо использовать от 0.0 до 1.0, так как значение 0.0 по x - это левая сторона текстуры, 1.0 по x - правая, 0.0 по y - верхняя, 1.0 - нижняя.

