C++ OpenGL 2d纹理渲染问题
我试图加载和绘制一个二维纹理使用OpenGL与GLFW和土壤。我有这个代码,但我只得到一种纯色(似乎来自纹理) 我已经用SOIL附带的一个示例测试了.png是否加载,它工作得很好,所以我的代码中一定存在一些问题 这是我的代码:C++ OpenGL 2d纹理渲染问题,c++,opengl,C++,Opengl,我试图加载和绘制一个二维纹理使用OpenGL与GLFW和土壤。我有这个代码,但我只得到一种纯色(似乎来自纹理) 我已经用SOIL附带的一个示例测试了.png是否加载,它工作得很好,所以我的代码中一定存在一些问题 这是我的代码: #include <cstdio> #include "GL/glfw.h" #include "SOIL.h" // function declarations void drawscene(); void idlefunc(); void update
#include <cstdio>
#include "GL/glfw.h"
#include "SOIL.h"
// function declarations
void drawscene();
void idlefunc();
void updatedisplay();
// global data
GLuint texture; // our example texture
int main(int argc, char **argv) {
if (!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFW\n");
return 1;
}
if (!glfwOpenWindow(640, 480, 0, 0, 0, 0, 16, 0, GLFW_WINDOW)) {
fprintf(stderr, "Failed to open GLFW window\n");
return 1;
}
// enable vsync (if available)
glfwSwapInterval(1);
// load textures
texture = SOIL_load_OGL_texture(
"tex.png",
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_POWER_OF_TWO | SOIL_FLAG_MIPMAPS | SOIL_FLAG_DDS_LOAD_DIRECT
);
// check for an error during the texture loading
if (!texture) {
printf("SOIL loading error: '%s'\n", SOIL_last_result());
}
while (glfwGetWindowParam(GLFW_OPENED)) {
idlefunc();
}
// if we get here something went wrong
return 0;
}
// this function gets called every frame
void idlefunc() {
updatedisplay();
drawscene();
}
// set up te display
void updatedisplay() {
int screen_width, screen_height;
glfwGetWindowSize(&screen_width, &screen_height);
if (screen_height <= 0) screen_height = 1;
if (screen_width <= 0) screen_width = 1;
glViewport(0, 0, screen_width, screen_height);
glClearColor(0.02f, 0.02f, 0.02f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, screen_width, screen_height, 0.0, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// displacement trick for exact pixelization
glTranslatef(0.375f, 0.375f, 0.0f);
}
// draw the scene in this function
void drawscene() {
glBindTexture(GL_TEXTURE_2D, texture);
glPushMatrix();
glTranslatef(10.0f, 10.0f, 0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glTexCoord2f(0.0f, 128.0f);
glVertex2f(0.0f, 128.0f);
glTexCoord2f(128.0f, 128.0f);
glVertex2f(128.0f, 128.0f);
glTexCoord2f(128.0f, 0.0f);
glVertex2f(128.0f, 0.0f);
glEnd();
glPopMatrix();
glfwSwapBuffers();
}
#包括
#包括“GL/glfw.h”
#包括“土壤h”
//函数声明
void drawsecene();
void idlefunc();
void updatedisplay();
//全球数据
胶合纹理;//我们的示例纹理
int main(int argc,字符**argv){
如果(!glfwInit()){
fprintf(stderr,“未能初始化GLFW\n”);
返回1;
}
如果(!glfwOpenWindow(640、480、0、0、0、16、0、GLFW_窗口)){
fprintf(stderr,“无法打开GLFW窗口\n”);
返回1;
}
//启用vsync(如果可用)
glfwSwapInterval(1);
//加载纹理
纹理=土壤\u负载\u OGL\u纹理(
“tex.png”,
土壤负荷自动控制,
土壤\u创建\u新的\u ID,
土壤标志两个的功率土壤标志MIPMAPS土壤标志直接负载
);
//在纹理加载过程中检查错误
如果(!纹理){
printf(“土壤加载错误:'%s'\n',土壤上次结果());
}
while(glfwGetWindowParam(GLFW_打开)){
idlefunc();
}
//如果我们到了这里,就会出问题
返回0;
}
//此函数每帧调用一次
void idlefunc(){
updatedisplay();
drawscene();
}
//设置te显示
void updatedisplay(){
int屏幕宽度、屏幕高度;
GLFWGetWindowsSize(屏幕宽度和屏幕高度);
如果(screen_height发现问题(感谢用户786653)。无论顶点坐标如何,tex坐标都在0.0和1.0之间。这是固定代码:
// draw the scene in this function
void drawscene() {
glBindTexture(GL_TEXTURE_2D, texture);
glPushMatrix();
glTranslatef(10.0f, 10.0f, 0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(0.0f, 128.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(128.0f, 128.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(128.0f, 0.0f);
glEnd();
glPopMatrix();
glfwSwapBuffers();
}
发现问题(感谢用户786653)。无论顶点坐标如何,tex坐标都在0.0和1.0之间。这是固定代码:
// draw the scene in this function
void drawscene() {
glBindTexture(GL_TEXTURE_2D, texture);
glPushMatrix();
glTranslatef(10.0f, 10.0f, 0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(0.0f, 128.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(128.0f, 128.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(128.0f, 0.0f);
glEnd();
glPopMatrix();
glfwSwapBuffers();
}
可能不是(唯一)原因,但纹理坐标通常在0..1范围内给出。你是指glTexCoord2f
?我真的很想用像素坐标来表示四边形的位置/大小。非常简单(我不熟悉你使用的库,所以我可能不在这里):OpenGL主要在0..1坐标下工作,这很方便,因此您不必担心您的纹理是256x256还是512x512,或者屏幕是HD还是SD,但这意味着您必须自己跟踪大小,并在关注像素时适当缩放。可能不是(唯一)原因是,但纹理坐标通常在0..1范围内给出,你是说仅是glTexCoord2f
?我真的很想使用像素坐标作为四边形的位置/大小。非常简单(我不熟悉你使用的库,所以我可能不在这里):OpenGL主要在0..1坐标下工作,这很方便,因此您不必担心纹理是256x256还是512x512,或者屏幕是HD还是SD,但这意味着您必须自己跟踪大小,并在关注像素时进行适当缩放。