- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在绘制一个带有纹理的 3D 立方体,我得到了这样的东西。我不完全知道出了什么问题;/ http://i.stack.imgur.com/081nl.png
texturecord 的 vector
vec2(0.0f, 0.0f),
vec2(1.0f, 0.0f),
vec2(1.0f, 1.0f),
vec2(0.0f, 1.0f),
....
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 9));
....
glUniform1i(glGetUniformLocation(program, "mySampler"), 0);
....
color = texture(myTextureSampler,UV); //SHADER CODE
要加载我使用的第一个示例:
SDL_Surface* textures;
textures = SDL_LoadBMP(filename);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
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_RGB8, textures->w, textures->h, 0, GL_RGB, GL_UNSIGNED_BYTE, textures->pixels);
我用的第二张照片:
int width, height;
GLubyte * data;
FILE * file;
file = fopen(filename, "rb");
if (file == NULL) return 0;
width = 128;
height = 128;
data = (GLubyte *)malloc(width * height * 3);
//int size = fseek(file,);
fread(data, width * height * 3, 1, file);
fclose(file);
for (int i = 0; i < width * height; ++i)
{
int index = i * 3;
unsigned char B, R;
B = data[index];
R = data[index + 2];
data[index] = R;
data[index + 2] = B;
}
glActiveTexture(GL_TEXTURE0);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
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_RGB, 128, 128, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
两者都不正确;//有什么想法吗?
完整程序:
主要.cpp:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <fstream>
#include <GL\glew.h> // UP
#include <GL\glut.h>
#include <GLFW\glfw3.h>
#include <glm\gtc\matrix_transform.hpp>
#include <glm\gtx\transform.hpp>
#include <SDL.h>
using namespace glm;
GLuint LoadTexture(const char * filename)
{
int width, height;
GLubyte * data;
FILE * file;
file = fopen(filename, "rb");
if (file == NULL) return 0;
width = 128;
height = 128;
data = (GLubyte *)malloc(width * height * 3);
//int size = fseek(file,);
fread(data, width * height * 3, 1, file);
fclose(file);
for (int i = 0; i < width * height; ++i)
{
int index = i * 3;
unsigned char B, R;
B = data[index];
R = data[index + 2];
data[index] = R;
data[index + 2] = B;
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glActiveTexture(GL_TEXTURE0);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
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_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
//free(data);
return texture;
/**
SDL_Surface* textures;
textures = SDL_LoadBMP(filename);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
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_RGB8, textures->w, textures->h, 0, GL_RGB, GL_UNSIGNED_BYTE, textures->pixels);
return texture;
**/
}
std::string LoadFileToString(const char* filepath){
std::string fileData = "";
std::ifstream stream(filepath, std::ios::in);
if (stream.is_open()){
std::string line = "";
while (getline(stream, line)){
fileData += "\n" + line;
}
stream.close();
}
return fileData;
}
GLuint LoadShaders(const char*VertShaderPath, const char* fragShaderPath){
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
std::string vertShaderSource = LoadFileToString(VertShaderPath);
std::string fragShaderSource = LoadFileToString(fragShaderPath);
const char* rawVertShaderSource = vertShaderSource.c_str();
const char* rawfragShaderSource = fragShaderSource.c_str();
glShaderSource(vertShader, 1, &rawVertShaderSource, NULL);
glShaderSource(fragShader, 1, &rawfragShaderSource, NULL);
glCompileShader(vertShader);
glCompileShader(fragShader);
GLuint program = glCreateProgram();
glAttachShader(program, vertShader);
glAttachShader(program, fragShader);
glLinkProgram(program);
return program;
}
const float movementspeed = 0.01f;
class Camera{
vec3 position;
vec3 viewDirection;
const vec3 UP;
vec2 oldmouseposition;
public:
Camera();
mat4 getWorldToViewMatrix() const;
void mouseUpdate(const vec2 &newMousePosition);
void moveForward();
void moveBackWard();
void left();
void right();
void up();
void down();
};
Camera::Camera() :viewDirection(0.0f, 0.0f, -1.0f), UP(0.0f, 1.0f, 0.0f){}
void Camera::mouseUpdate(const vec2 &newMousePosition){
glm::vec2 mouseDelta = newMousePosition - oldmouseposition;
if (glm::length(mouseDelta) >10.0f)
{
oldmouseposition = newMousePosition;
return;
}
viewDirection = glm::mat3(glm::rotate(-mouseDelta.x*0.5f, UP)) * viewDirection;
oldmouseposition = newMousePosition;
}
void Camera::moveForward(){
position -= movementspeed *viewDirection;
}
void Camera::moveBackWard(){
position += movementspeed *viewDirection;
}
void Camera::left(){
glm::vec3 strafeDirection = glm::cross(viewDirection, UP);
position += movementspeed *strafeDirection;
}
void Camera::right(){
glm::vec3 strafeDirection = glm::cross(viewDirection, UP);
position += -movementspeed *strafeDirection;
}
void Camera::up(){
position += movementspeed *UP;
}
void Camera::down(){
position += -movementspeed *UP;
}
mat4 Camera::getWorldToViewMatrix() const {
return lookAt(position, position - viewDirection, UP);
}
int main(int argc, char ** argv)
{
if (!glfwInit())
exit(EXIT_FAILURE);
GLFWwindow* window;
window = glfwCreateWindow(640, 480, "My 3D World", NULL, NULL);
if (!window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glewExperimental = true;
if (glewInit() != GLEW_OK){
glfwTerminate();
exit(EXIT_FAILURE);
}
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
GLuint program = LoadShaders("vertex.wss", "fragment.fss"); // shadersprogram
struct Vertex{
glm::vec3 position;
glm::vec3 color;
glm::vec2 texture;
glm::vec3 normal;
};
Vertex verts[] = {
vec3(-1.0f, +1.0f, +1.0f), // 0
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, +1.0f), // 1
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, -1.0f), // 2
vec3(1.0f, 0.0f, 0.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, +1.0f, -1.0f), // 3
vec3(0.0f, 0.0f, 0.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, +1.0f, -1.0f), // 4
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, -1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, -1.0f), // 5
vec3(1.0f, 0.0f, 0.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, -1.0f, 0.0f), //normal
vec3(+1.0f, -1.0f, -1.0f), //
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, -1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, -1.0f), // 7
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, -1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, -1.0f), // 8
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 0.0f, -1.0f), //normal
vec3(+1.0f, +1.0f, +1.0f), // 9
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 0.0f, -1.0f), //normal
vec3(+1.0f, -1.0f, +1.0f), // 10
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 0.0f, -1.0f), //normal
vec3(+1.0f, -1.0f, -1.0f), // 11
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 0.0f, -1.0f), //normal
vec3(-1.0f, +1.0f, +1.0f), // 12
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, +1.0f, -1.0f), // 13
vec3(1.0f, 0.0f, 0.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, -1.0f), // 14
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, +1.0f), // 15
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, +1.0f), // 16
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, +1.0f, +1.0f), // 17
vec3(1.0f, 0.0f, 1.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, +1.0f), // 18
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, -1.0f, +1.0f), // 19
vec3(1.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, -1.0f, -1.0f), // 20
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, -1.0f), // 21
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, +1.0f), // 22
vec3(0.0f, 1.0f, 1.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, -1.0f, +1.0f), // 23
vec3(1.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f) //normal
};
GLushort indices[] = {
0, 1, 2, 0, 2, 3, // Top
4, 5, 6, 4, 6, 7, // Front
8, 9, 10, 8, 10, 11, // Right
12, 13, 14, 12, 14, 15, // Left
16, 17, 18, 16, 18, 19, // Back
20, 22, 21, 20, 23, 22 // Bottom
};
////////VAO niepotrzebne
////////VBO
GLuint vboID;
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
GLuint indexbuff;
glGenBuffers(1, &indexbuff);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuff);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW);
//////
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, LoadTexture("block"));
Camera camera;
while (!glfwWindowShouldClose(window))
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glUseProgram(program);
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS){
camera.moveForward();
}
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS){
camera.moveBackWard();
}
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS){
camera.left();
}
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS){
camera.right();
}
if (glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS){
camera.up();
}
if (glfwGetKey(window, GLFW_KEY_F) == GLFW_PRESS){
camera.down();
}
if (xpos > 0 && xpos < 640 && ypos>0 && ypos < 400){
camera.mouseUpdate(vec2(float(xpos / 50), float(ypos / 50)));
std::cout << "pos x: " << xpos << "pos y: " << ypos << std::endl;
}
// textures
glUniform1i(glGetUniformLocation(program, "mySampler"), 0);
//AMBIENT LIGHT
GLint ambientlightlocation = glGetUniformLocation(program, "ambientLight");
vec3 ambientLight(0.3f, 0.3f, 0.3f);
glUniform3fv(ambientlightlocation, 1, &ambientLight[0]);
//Light
GLint lightlocation = glGetUniformLocation(program, "lightPosition");
vec3 lightposition(1.0f, 1.0f, -3.75f);
glUniform3fv(lightlocation, 1, &lightposition[0]);
GLint fullTransformMatrixUniformLocation = glGetUniformLocation(program, "fullTransformMatrix");
mat4 fullTransformMatrix;
mat4 projectionMatrix = perspective(90.0f, (480.0f / 640.0f), 0.1f, 5.0f);
mat4 worldToProjectionMatrix = projectionMatrix* camera.getWorldToViewMatrix();
//CUBE 1 tak sie robi gdyby sie roznily
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (void*)0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 3));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 6));
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 9));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuff);
mat4 cube1WorldMatrix = translate(vec3(1.0f, 0.0f, -3.75f)) * rotate(0.0f, vec3(0.0f, 1.0f, 1.0f));
fullTransformMatrix = worldToProjectionMatrix *cube1WorldMatrix;
glUniformMatrix4fv(fullTransformMatrixUniformLocation, 1, GL_FALSE, &fullTransformMatrix[0][0]);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0);
// CUBE 2 gdyby byly rozne
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (void*)0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 3));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 6));
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 9));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuff);
mat4 cube2WorldMatrix = translate(vec3(-3.0f, 0.0f, -3.75f)) * rotate(126.0f, vec3(1.0f, 0.0f, 0.0f));
fullTransformMatrix = worldToProjectionMatrix *cube2WorldMatrix;
glUniformMatrix4fv(fullTransformMatrixUniformLocation, 1, GL_FALSE, &fullTransformMatrix[0][0]);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}
片段.fss:
#version 330 core
out vec4 color;
in vec3 theColor;
in vec2 UV;
uniform sampler2D myTextureSampler;
void main()
{
color = texture(myTextureSampler,UV);
//texture(myTextureSampler,UV);
// * vec4(theColor,1.0);
}
顶点.wss:
#version 330 core
layout(location=0) in vec3 in_pos;
layout(location=1) in vec3 vertexColor;
layout(location=2) in vec2 vertexUV;
layout(location=3) in vec3 normal;
uniform mat4 fullTransformMatrix;
uniform vec3 ambientLight;
uniform vec3 lightPosition;
out vec3 theColor;
out vec2 UV;
void main()
{
vec4 v = vec4(in_pos, 1.0);
gl_Position = fullTransformMatrix* v;
vec3 lightVector = normalize(lightPosition-normal);
float brightness = dot(lightVector,normal);
theColor = vertexColor * vec3( brightness, brightness, brightness);// * ambientLight;
UV = vertexUV;
}
最佳答案
如果你想加载压缩图像,你需要一个合适的解码器。
您的 LoadTexture()
函数假定传入的所有内容是一个未压缩的、紧密打包的 RGB 三元组,这不是一个好的假设 :)
这是一个使用 stb_image
的例子和一个 screenshot PNG :
GLuint LoadTexture(const char * filename)
{
int width = 0, height = 0, n = 0;
unsigned char* data = stbi_load
(
filename,
&width,
&height,
&n,
3
);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glActiveTexture(GL_TEXTURE0);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
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_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
stbi_image_free( data );
return texture;
}
一起:
#include <iostream>
#include <cstdarg>
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#define GLM_FORCE_RADIANS
#include <glm\gtc\matrix_transform.hpp>
#include <glm\gtx\transform.hpp>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
using namespace glm;
struct Program
{
static GLuint Load( const char* shader, ... )
{
GLuint prog = glCreateProgram();
va_list args;
va_start( args, shader );
while( shader )
{
const GLenum type = va_arg( args, GLenum );
AttachShader( prog, type, shader );
shader = va_arg( args, const char* );
}
va_end( args );
glLinkProgram( prog );
CheckStatus( prog );
return prog;
}
private:
static void CheckStatus( GLuint obj )
{
GLint status = GL_FALSE;
if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
if( status == GL_TRUE ) return;
GLchar log[ 1 << 15 ] = { 0 };
if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
std::cerr << log << std::endl;
exit( EXIT_FAILURE );
}
static void AttachShader( GLuint program, GLenum type, const char* src )
{
GLuint shader = glCreateShader( type );
glShaderSource( shader, 1, &src, NULL );
glCompileShader( shader );
CheckStatus( shader );
glAttachShader( program, shader );
glDeleteShader( shader );
}
};
#define GLSL(version, shader) "#version " #version "\n" #shader
const char* vert = GLSL
(
330 core,
layout(location=0) in vec3 in_pos;
layout(location=1) in vec3 vertexColor;
layout(location=2) in vec2 vertexUV;
layout(location=3) in vec3 normal;
uniform mat4 fullTransformMatrix;
uniform vec3 ambientLight;
uniform vec3 lightPosition;
out vec3 theColor;
out vec2 UV;
void main()
{
vec4 v = vec4(in_pos, 1.0);
gl_Position = fullTransformMatrix* v;
vec3 lightVector = normalize(lightPosition-normal);
float brightness = dot(lightVector,normal);
theColor = vertexColor * vec3( brightness, brightness, brightness);// * ambientLight;
UV = vertexUV;
}
);
const char* frag = GLSL
(
330 core,
out vec4 color;
in vec3 theColor;
in vec2 UV;
uniform sampler2D mySampler;
void main()
{
color = texture(mySampler,UV);
}
);
GLuint LoadTexture(const char * filename)
{
int width = 0, height = 0, n = 0;
unsigned char* data = stbi_load
(
filename,
&width,
&height,
&n,
3
);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glActiveTexture(GL_TEXTURE0);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
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_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
stbi_image_free( data );
return texture;
}
const float movementspeed = 0.01f;
class Camera{
vec3 position;
vec3 viewDirection;
const vec3 UP;
vec2 oldmouseposition;
public:
Camera();
mat4 getWorldToViewMatrix() const;
void mouseUpdate(const vec2 &newMousePosition);
void moveForward();
void moveBackWard();
void left();
void right();
void up();
void down();
};
Camera::Camera() :viewDirection(0.0f, 0.0f, -1.0f), UP(0.0f, 1.0f, 0.0f){}
void Camera::mouseUpdate(const vec2 &newMousePosition){
glm::vec2 mouseDelta = newMousePosition - oldmouseposition;
if (glm::length(mouseDelta) >10.0f)
{
oldmouseposition = newMousePosition;
return;
}
viewDirection = glm::mat3(glm::rotate(-mouseDelta.x*0.5f, UP)) * viewDirection;
oldmouseposition = newMousePosition;
}
void Camera::moveForward(){
position -= movementspeed *viewDirection;
}
void Camera::moveBackWard(){
position += movementspeed *viewDirection;
}
void Camera::left(){
glm::vec3 strafeDirection = glm::cross(viewDirection, UP);
position += movementspeed *strafeDirection;
}
void Camera::right(){
glm::vec3 strafeDirection = glm::cross(viewDirection, UP);
position += -movementspeed *strafeDirection;
}
void Camera::up(){
position += movementspeed *UP;
}
void Camera::down(){
position += -movementspeed *UP;
}
mat4 Camera::getWorldToViewMatrix() const {
return lookAt(position, position - viewDirection, UP);
}
int main(int argc, char ** argv)
{
if (!glfwInit())
exit(EXIT_FAILURE);
GLFWwindow* window;
window = glfwCreateWindow(640, 480, "My 3D World", NULL, NULL);
if (!window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glewExperimental = true;
if (glewInit() != GLEW_OK){
glfwTerminate();
exit(EXIT_FAILURE);
}
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
GLuint program = Program::Load
(
vert, GL_VERTEX_SHADER,
frag, GL_FRAGMENT_SHADER,
NULL
);
struct Vertex{
glm::vec3 position;
glm::vec3 color;
glm::vec2 texture;
glm::vec3 normal;
};
Vertex verts[] = {
vec3(-1.0f, +1.0f, +1.0f), // 0
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, +1.0f), // 1
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, -1.0f), // 2
vec3(1.0f, 0.0f, 0.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, +1.0f, -1.0f), // 3
vec3(0.0f, 0.0f, 0.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, +1.0f, -1.0f), // 4
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, -1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, -1.0f), // 5
vec3(1.0f, 0.0f, 0.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, -1.0f, 0.0f), //normal
vec3(+1.0f, -1.0f, -1.0f), //
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, -1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, -1.0f), // 7
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, -1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, -1.0f), // 8
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 0.0f, -1.0f), //normal
vec3(+1.0f, +1.0f, +1.0f), // 9
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 0.0f, -1.0f), //normal
vec3(+1.0f, -1.0f, +1.0f), // 10
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 0.0f, -1.0f), //normal
vec3(+1.0f, -1.0f, -1.0f), // 11
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 0.0f, -1.0f), //normal
vec3(-1.0f, +1.0f, +1.0f), // 12
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, +1.0f, -1.0f), // 13
vec3(1.0f, 0.0f, 0.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, -1.0f), // 14
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, +1.0f), // 15
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, +1.0f, +1.0f), // 16
vec3(0.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, +1.0f, +1.0f), // 17
vec3(1.0f, 0.0f, 1.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, +1.0f), // 18
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, -1.0f, +1.0f), // 19
vec3(1.0f, 0.0f, 1.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, -1.0f, -1.0f), // 20
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, -1.0f), // 21
vec3(0.0f, 1.0f, 0.0f), // Colour
vec2(1.0f, 0.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(-1.0f, -1.0f, +1.0f), // 22
vec3(0.0f, 1.0f, 1.0f), // Colour
vec2(1.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f), //normal
vec3(+1.0f, -1.0f, +1.0f), // 23
vec3(1.0f, 1.0f, 0.0f), // Colour
vec2(0.0f, 1.0f),
vec3(0.0f, 1.0f, 0.0f) //normal
};
GLushort indices[] = {
0, 1, 2, 0, 2, 3, // Top
4, 5, 6, 4, 6, 7, // Front
8, 9, 10, 8, 10, 11, // Right
12, 13, 14, 12, 14, 15, // Left
16, 17, 18, 16, 18, 19, // Back
20, 22, 21, 20, 23, 22 // Bottom
};
////////VAO niepotrzebne
////////VBO
GLuint vboID;
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
GLuint indexbuff;
glGenBuffers(1, &indexbuff);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuff);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW);
//////
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, LoadTexture("TADdR.png"));
Camera camera;
while (!glfwWindowShouldClose(window))
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glUseProgram(program);
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS){
camera.moveForward();
}
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS){
camera.moveBackWard();
}
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS){
camera.left();
}
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS){
camera.right();
}
if (glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS){
camera.up();
}
if (glfwGetKey(window, GLFW_KEY_F) == GLFW_PRESS){
camera.down();
}
if (xpos > 0 && xpos < 640 && ypos>0 && ypos < 400){
camera.mouseUpdate(vec2(float(xpos / 50), float(ypos / 50)));
std::cout << "pos x: " << xpos << "pos y: " << ypos << std::endl;
}
// textures
glUniform1i(glGetUniformLocation(program, "mySampler"), 0);
//AMBIENT LIGHT
GLint ambientlightlocation = glGetUniformLocation(program, "ambientLight");
vec3 ambientLight(0.3f, 0.3f, 0.3f);
glUniform3fv(ambientlightlocation, 1, &ambientLight[0]);
//Light
GLint lightlocation = glGetUniformLocation(program, "lightPosition");
vec3 lightposition(1.0f, 1.0f, -3.75f);
glUniform3fv(lightlocation, 1, &lightposition[0]);
GLint fullTransformMatrixUniformLocation = glGetUniformLocation(program, "fullTransformMatrix");
mat4 fullTransformMatrix;
mat4 projectionMatrix = perspective( glm::radians( 90.0f ), (480.0f / 640.0f), 0.1f, 5.0f);
mat4 worldToProjectionMatrix = projectionMatrix* camera.getWorldToViewMatrix();
//CUBE 1 tak sie robi gdyby sie roznily
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (void*)0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 3));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 6));
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 9));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuff);
mat4 cube1WorldMatrix = translate(vec3(1.0f, 0.0f, -3.75f)) * rotate(0.0f, vec3(0.0f, 1.0f, 1.0f));
fullTransformMatrix = worldToProjectionMatrix *cube1WorldMatrix;
glUniformMatrix4fv(fullTransformMatrixUniformLocation, 1, GL_FALSE, &fullTransformMatrix[0][0]);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0);
// CUBE 2 gdyby byly rozne
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (void*)0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 3));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 6));
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, (char*)(sizeof(float) * 9));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuff);
mat4 cube2WorldMatrix = translate(vec3(-3.0f, 0.0f, -3.75f)) * rotate(126.0f, vec3(1.0f, 0.0f, 0.0f));
fullTransformMatrix = worldToProjectionMatrix *cube2WorldMatrix;
glUniformMatrix4fv(fullTransformMatrixUniformLocation, 1, GL_FALSE, &fullTransformMatrix[0][0]);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}
关于c++ - 奇怪的 OpenGL 纹理显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32999430/
在 OpenGL/ES 中,在实现渲染到纹理功能时,您必须小心,不要引起反馈循环(从正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在
正如我们最终都知道的那样,规范是一回事,实现是另一回事。大多数错误是我们自己造成的,但有时情况并非如此。 我相信列出以下内容会很有用: GPU 驱动程序中当前已知的与最新版本的 OpenGL 和 GL
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
我正在学习 OpenGL,非常想知道与显卡的交互如何。 我觉得了解它是如何在图形驱动程序中实现的,会让我了解 opengl 的完整内部结构(通过这个我可以知道哪些阶段/因素影响我对 opengl 性能
我正在尝试绘制到大于屏幕尺寸(即 320x480)的渲染缓冲区 (512x512)。 执行 glReadPixels 后,图像看起来是正确的,除非图像的尺寸超过屏幕尺寸——在本例中,超过 320 水平
我正在 Windows 中制作一个 3D 小行星游戏(使用 OpenGL 和 GLUT),您可以在其中穿过一堆障碍物在太空中移动并生存下来。我正在寻找一种方法来针对无聊的 bg 颜色选项设置图像背景。
如果我想要一个包含 100 个 10*10 像素 Sprite 的 Sprite 表,是否可以将它们全部排成一排来制作 1,000*10 像素纹理?还是 GPU 对不那么窄的纹理表现更好?这对性能有什
这个问题在这里已经有了答案: Rendering 2D sprites in a 3D world? (7 个答案) 关闭 6 年前。 我如何概念化让图像始终面对相机。我尝试将三角函数与 arcta
是否可以在 OpenGL 中增加缓冲区? 假设我想使用实例化渲染。每次在世界上生成一个新对象时,我都必须用实例化数据更新缓冲区。 在这种情况下,我有一个 3 个 float 的缓冲区 std::v
有人可以向我解释为什么下面的代码没有绘制任何东西,但如果我使用 GL_LINE_LOOP 它确实形成了一个闭环吗? glBegin(GL_POLYGON); for(int i = 0; i <= N
正如标题所说,OpenGL 中的渲染目标是什么?我对 OpenGL 很陌生,我看到的所有网站都让我很困惑。 它只是一个缓冲区,我在其中放置稍后将用于渲染的东西吗? 如果您能提供一个很好的引用来阅读它,
当使用 OpenGL 1.4 固定功能多纹理时,每个纹理阶段的输出在传递到下一个阶段之前是否都固定在 [0, 1]? spec说(第 153 页): If the value of TEXTURE_E
我比较了 2 个函数 openGL ES 和 openGL gvec4 texelFetchOffset(gsampler2DArray sampler, ivec3 P, int lod, ivec
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
那么当你调用opengl函数时,比如glDraw或者gLBufferData,是否会导致程序线程停止等待GL完成调用呢? 如果不是,那么 GL 如何处理调用像 glDraw 这样的重要函数,然后立即更
我正在尝试实现级联阴影贴图,当我想访问我的视锥体的每个分区的相应深度纹理时,我遇到了一个错误。 更具体地说,当我想选择正确的阴影纹理时会出现我的问题,如果我尝试下面的代码,我会得到一个像 this 中
我想为OpenGL ES和OpenGL(Windows)使用相同的着色器源。为此,我想定义自定义数据类型并仅使用OpenGL ES函数。 一种方法是定义: #define highp #define
我尝试用 6 个位图映射立方体以实现天空盒效果。我的问题是一个纹理映射到立方体的每个面。我已经检查了 gDEBugger,在立方体纹理内存中我只有一个 图像(因为我尝试加载六个图像)。 代码准备纹理:
在 OpenGL 中偏移深度的最佳方法是什么?我目前每个多边形都有索引顶点属性,我将其传递给 OpenGL 中的顶点着色器。我的目标是在深度上偏移多边形,其中最高索引始终位于较低索引的前面。我目前有这
我是一名优秀的程序员,十分优秀!