我试图绘制一部分图片,但是重复图片的一部分,它已经拉伸了图片,看起来很难看.
我怎样才能重复图片而不是拉伸图片.
代码的相关部分:
glEnable (GL_BLEND);
glColor4f(1.0f,1.0f,1.0f,1.0f);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor3f(1.f, 1.f, 1.f);
glBindTexture(GL_TEXTURE_2D, texture[image]);
int repeat = (x2-x)/73;
glBegin(GL_QUADS); //create polygon
glTexCoord2f((part/3.f), 0.0f);glVertex2d(x, y);
glTexCoord2f(((part+1.f)/3.f)+repeat, 0.0f);glVertex2d(x2, y);
glTexCoord2f(((part+1.f)/3.f)+repeat, 1.0f);glVertex2d(x2, y2);
glTexCoord2f((part/3.f), 1.0f);glVertex2d(x, y2);
glEnd();
Run Code Online (Sandbox Code Playgroud)
和纹理的负荷:
texture[fNum] = SOIL_load_OGL_texture
(
fName.c_str(),
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y
);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
Run Code Online (Sandbox Code Playgroud)
这是您的帮助后的固定代码,但现在还有另一个问题,我想只重复图像的特定部分.非常感谢!
修复:现在我使用我自己的代码来重复它并且它有效:
float nx=x, nx2 = x+length;
float ny2 = y2+25.f;
if((x2-x)/length > 1)
{
while(nx2 < x2)
{
if(nx2+length < x2)
{
glBegin(GL_QUADS); //create polygon
glTexCoord2f((part/3.f), 0.0f);glVertex2d(nx, y);
glTexCoord2f(((part+1.f)/3.f), …Run Code Online (Sandbox Code Playgroud) 我对新的OpenGL扩展,它们需要什么硬件以及它们需要什么样的OpenGL版本感到困惑.
特别是它现在关于ARB_shader_image_load_store. http://www.opengl.org/registry/specs/ARB/shader_image_load_store.txt
据我所知,这是OpenGL 4.2的一个特性,但在OpenGL依赖项中,它是:
This extension is written against the OpenGL 3.2 specification
(Compatibility Profile).
This extension is written against version 1.50 (revision 09) of the OpenGL
Shading Language Specification.
OpenGL 3.0 and GLSL 1.30 are required.
Run Code Online (Sandbox Code Playgroud)
并进一步下来的东西
This extension interacts trivially with OpenGL 4.0 and ARB_sample_shading.
Run Code Online (Sandbox Code Playgroud)
这些东西意味着什么?使用此类扩展需要什么硬件和OpenGL版本?
我试图设置一个简单的函数,这将使我更容易在OpenGL中纹理地图几何,但出于某种原因,当我试图制作一个天空盒时,我得到一个白色的盒子而不是纹理映射的几何.我认为有问题的代码包含在以下内容中:
void MapTexture (char *File, int TextNum) {
if (!TextureImage[TextNum]){
TextureImage[TextNum]=auxDIBImageLoad(File);
glGenTextures(1, &texture[TextNum]);
glBindTexture(GL_TEXTURE_2D, texture[TextNum]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[TextNum]);
//glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data);
//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}
Run Code Online (Sandbox Code Playgroud)
最重要的事情,我不明白的是由于某种原因,glBindTexture()一定要来之间glGenTextures()和glTexImage2D.如果我把它放在其他任何地方,它会搞砸一切.什么可能导致这个问题?对不起,如果它很简单,我对openGL来说是全新的.
下面是我正在谈论的白盒的截图:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++
在更多地使用代码后,我意识到如果我添加glTexImage2D()并glTexParameteri()在最后一次glBindTexture()之后所有纹理加载.为什么没有这两行会加载大多数纹理,但是有一些不会加载,为什么我必须为每一帧调用glTexImage(),但仅限于几个纹理?
现在我在OpenGL中将六种不同的纹理应用于六个传真的立方体,但结果看起来并不正确.我从我的磁盘上加载了六张bmp图片,它们的大小都是256*256.我使用了SOIL(简单的OpenGL图像库:可以在这里下载:http://nehe.gamedev.net/tutorial/lesson_06_texturing_update/47002 /)加载bmp图片来构建纹理.
现在我在这里列出我的代码:
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include "SOIL.h"
GLuint texture[6];//6 textures for 6 faces of the cube
GLfloat xRot,yRot,zRot;//control cube's rotation
//load the bitmap and convert it into a texture
int LoadGLTextures()
{
int Status = 0;
char *bmpFile[6] = {"BmpFile/Ferrary.bmp","BmpFile/Honda.bmp","BmpFile/Hust.bmp",
"BmpFile/Lamborghini.bmp","BmpFile/NeHe.bmp","BmpFile/Porsche.bmp"};
for (int i = 0;i < 6;++i)
{
texture[i] = SOIL_load_OGL_texture(
bmpFile[i],
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_INVERT_Y);
printf("texture[%d]: %d\n",i,texture[i]);
if(texture[i] == 0)
Status = 0;
glBindTexture(GL_TEXTURE_2D,texture[i]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}
return Status;
}
int …Run Code Online (Sandbox Code Playgroud) 是否可以在不声明曲面法线的情况下声明对象上的光照?
我愿意做的步骤是:
1. enable lighting
2. define surface material
3. define lighting position
4. define lighting parms : ambient....
Run Code Online (Sandbox Code Playgroud)
这还不够,还是我必须放在哪里呢?
我最近一直在搞乱OpenGL,我注意到每当我试图调整窗口大小时,Windows消息泵就会阻塞,因此每当我点击菜单栏或调整窗口大小时,渲染就会停止.
为了解决这个问题,我正在研究多线程.
我有以下内容:
_beginthread(RenderEntryPoint, 0, 0);
while (!done)
{
PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE);
if (msg.message == WM_QUIT)
{
done = true;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
void RenderEntryPoint(void *args)
{
while (1)
{
//render code
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我的场景没有渲染,我不知道为什么.
我需要显示一些索引图形文件,另外还有每像素alpha通道.此外,我需要确保我可以随时更改调色板,结果图像也会改变.为此,我首先使用了软件像素预计算,但这对于实时渲染来说太慢了,所以我决定编写一个将在GPU端处理索引纹理的着色器.问题是第二个纹理(rec_colors)没有加载(至少看起来是这样 - 从该采样器读取的每个纹素都显示为空).
来自零纹理的数据正确读取,导致右图像的黑色图像:)
与着色器初始化相关的代码:
Application::Display->GetRC();
glewInit();
if(!GLEW_VERSION_2_0) return false;
char* code_frag = loadCode("shader.frag");
char* code_verx = loadCode("shader.verx");
aShader_palette = glCreateShader(GL_FRAGMENT_SHADER);
//glShaderSource(aShader_palette, 1, &aShaderProgram_palette, NULL);
glShaderSource(aShader_palette, 1, (const GLchar**)&code_frag, NULL);
glCompileShader(aShader_palette);
GLint compiled = 0;
glGetShaderiv(aShader_palette, GL_COMPILE_STATUS, &compiled);
if(!compiled)
{
/* error-handling */
}
GLuint texloc = glGetUniformLocation(aShader_palette, "rec");
glUniform1i(texloc, 0);
texloc = glGetUniformLocation(aShader_palette, "rec_colors");
glUniform1i(texloc, 1);
glsl_palette_Program = glCreateProgram();
glAttachShader(glsl_palette_Program, aShader_palette);
glLinkProgram(glsl_palette_Program);
Run Code Online (Sandbox Code Playgroud)
与渲染相关:
glPushAttrib(GL_CURRENT_BIT);
glColor4ub(255, 255, 255, t_a); // t_a is overall alpha of sprite displayed
glUseProgram(glsl_palette_Program); // this …Run Code Online (Sandbox Code Playgroud) 我是LWJGL/OpenGL的新手,我遇到过这个问题,无法解决,无论我尝试什么:
当我在屏幕上绘制多个立方体时,无论多维数据集与"相机"的距离有多远,它在点亮时都会达到相同的亮度.这意味着当我在屏幕上绘制大量立方体时,它们会获得相同数量的光线并且看起来很奇怪.
我的源代码:http://pastebin.com/qd5dsZ89
如何修复它以使光线在所有区域中混合而不会突然中断?
我使用GQLWidget使用OpenGL的两个应用程序验证了这一点.如果屏幕更新非常频繁,例如30 fps,和/或分辨率很高,其中一个内核的CPU使用量就会急剧上升.我正在寻找一个解决方案,如何解决这个问题和/或验证它是否也发生在Windows上.
我正在尝试将GLSL 4.2移植到1.2(因为我使用的是mac),但是,我不确定如何将out参数转换为1.2(因为它会生成错误).
out vec3 vNormal;
out vec2 texcoord;
out vec3 vPosition;
编译器错误如下.
Invalid qualifiers 'out' in global variable context
ERROR: 0:13: Invalid qualifiers 'out' in global variable context
ERROR: 0:14: Invalid qualifiers 'out' in global variable context
ERROR: 0:19: Use of undeclared identifier 'texcoord'
ERROR: 0:20: Use of undeclared identifier 'vNormal'
ERROR: 0:21: Use of undeclared identifier 'vPosition'Run Code Online (Sandbox Code Playgroud)